title: Python: Can't start new thread. <100 active threads
body: <p>I'm getting the following error:</p>
  
  <pre><code>----- Match 93028: ------ Patch 5.11 ------78 Threads Active
  ----- Match 93029: ------ Patch 5.11 ------77 Threads Active
  ----- Match 93030: ------ Patch 5.11 ------76 Threads Active
  ----- Match 93031: ------ Patch 5.11 ------71 Threads Active
  ----- Match 93032: ------ Patch 5.11 ------55 Threads Active
  ----- Match 93033: ------ Patch 5.11 ------56 Threads Active
  ----- Match 93034: ------ Patch 5.11 ------57 Threads Active
  ----- Match 93035: ------ Patch 5.11 ------58 Threads Active
  ----- Match 93036: ------ Patch 5.11 ------59 Threads Active
  Traceback (most recent call last):
    File "pulldata.py", line 91, in &lt;module&gt;
      getPatchData('5.11', '511')
    File "pulldata.py", line 64, in getPatchData
      matchThread.start()
    File "/usr/lib/python3.4/threading.py", line 850, in start
      _start_new_thread(self._bootstrap, ())
  RuntimeError: can't start new thread
  </code></pre>
  
  <p>Normally this is caused by having too many threads open but as you can see I'm also printing the number of threads active. There are &lt;100 active threads so I'm not sure what the problem is. Here is the relevant code:</p>
  
  <pre><code>slot = threading.BoundedSemaphore(value=1000)
  def getMatchData(index,match,patch):
      global requestsSent
      global logfile
      print("----- Match {0}: ------ Patch {1} ------{2} Threads Active".format(index,patch,threading.active_count()))
      logfile.write("Parsing Match {0} for patch {1}:\n".format(index,patch))
  
      #match is a class. get is a function that sends a request to the server and returns a request object from where I get the json response.
      data = match.get().json()
  
      #processdata
  
      slot.release()
  
  def getPatchData(patch, name):
      global logfile
      threads = []
      matches = getAllMatches(patch)
      for index, match in enumerate(matches):
          slot.acquire()
          matchThread = threading.Thread(target=getMatchData, args=(index,match,patch))
          threads.append(matchThread)
          matchThread.start()
          for t in threads:
              if not t.isAlive():
                  threads.remove(t)
  
      for t in threads:
          t.join()
  </code></pre>
  
  <p>The slots semaphore is supposed to limit the number of active threads but I don't think I ever reached 1000 threads anyway. Before I assumed this error was being caused due to threads being pointed to by my array of threads so I added code to remove them from the array when they were no longer active.</p>
  
  <p>I can't understand why I get can't start a new thread when there are only 59 active threads. </p>
  
  <p>Also, is there a better way to achieve what I am trying to do? Each thread sends a request to an API. I tried doing it without concurrency but I wasn't even coming close to my rate limit.</p>