title: Error "cannot schedule new futures after interpreter shutdown" with boto3 while working through treading
body: <p>Good day. I got a huge issue that i can't resolve by myself for 3 days already.
  We have application that creates Json files and sending them to amazon s3 server through boto3 library. This app developed on python 3.8 and there was no issues. Then python has been upgraded to 3.9+ and issue popped up.
  We need to use threading in this app so we created a new class for it:</p>
  <pre><code>class NewThread(Thread):
      def __init__(self, name):
          Thread.__init__(self)
          self.name = name
  
      def run(self):
          global i, listings
          if self.name=='control':
              # here is control-thread. Code removed for this example
              while True:
                  time.sleep(10)
          else:
              i += 1
              print(f'Thread {self.name} works on {files[i]}')
              try:
                  create_file(files[i])
                  move_file(c.root+f'json/{files[i].replace(&quot;.&quot;, &quot;-&quot;)}.json', 's3folder')
              except Exception as e:
                  get_exception(e)
  </code></pre>
  <p>Function create_file() is long and boring. It creates json file with size of 20-25kb and using nothing difficult in it. Then files must be moved to s3 by function <strong>move_file()</strong>. Here is code:</p>
  <pre><code># Function for moving files to s3 bucket
  def move_file(file, path, bucket=c.s3cfg['bucket'], folder=c.s3cfg['folder']):
      s3 = boto3.client('s3', aws_access_key_id=c.s3cfg['access_key'], aws_secret_access_key=c.s3cfg['secret_key'])
      name = file.split('/')
      name = folder + '/' + path + '/' + name[len(name) - 1]
      try:
          s3.upload_file(file, bucket, name)
          os.remove(file)
      except Exception as e:
          get_exception(e)
  </code></pre>
  <p>Threads starting by this:</p>
  <pre><code>def start_thread(count=5):
      NewThread(name='control').start()
      for i in range(count):
          name = f'thread_{i+1}'
          threads[name] = NewThread(name=name)
          threads[name].start()
          time.sleep(0.5)
  </code></pre>
  <p>Here is error message:</p>
  <blockquote>
  <p>cannot schedule new futures after interpreter shutdown; Place: script.py; Line: 49;</p>
  </blockquote>
  <p>This row links to s3.upload_file(file, bucket, name) in code. But this error showed not every time. Sometimes it can send few files to server before starting this error. Boto3 works good in separate non-thread script even from mofe_file() function. And this code works good on python 3.8. Looks like there is some global variable shutdown that being set to True somevhere in working process.
  Please, help me understand and solve this quest of pain.</p>