title: What happens when I multiprocessing.pool.apply_async more times than I have processors
body: <p>I have the following setup:</p>
  
  <pre><code>results = [f(args) for _ in range(10**3)]
  </code></pre>
  
  <p>But, <code>f(args)</code> takes a long time to compute. So I'd like to throw multiprocessing at it. I would like to do so by doing:</p>
  
  <pre><code>pool = mp.pool(mp.cpu_count() -1) # mp.cpu_count() -&gt; 8
  results = [pool.apply_async(f, args) for _ in range(10**3)]
  </code></pre>
  
  <p>Clearly, I don't have 1000 processors on my computer, so my concern:<br>
  Does the above call result in 1000 processes simultaneously competing for CPU time or 7 processes running simultaneously, iteratively computing the next <code>f(args)</code> when the previous call finishes?</p>
  
  <p>I suppose I could do something like <code>pool.async_map(f, (args for _ in range(10**3)))</code> to get the same results, but the purpose of this post is to understand the behavior of <code>pool.apply_async</code></p>