擅长:python、mysql、java
<p>使用<code>pool.apply_async</code>可以被认为非常类似于在前面的问题中手动设置<code>map</code>在幕后进行的每个调用。您只需将所有任务添加到池中,当新的工作进程可用时,它就会快速处理这些任务。您可以使用与<a href="https://stackoverflow.com/a/26534740/2069350">skrrgwasme suggested</a>相同的每个浏览器一个函数的方法。下面的代码大量引用了他对前一个问题的回答:</p>
<pre><code>from multiprocessing import Pool
params = [1,2,3,4,5 ... ]
def ff_func(param):
# Do FireFox stuff
def ch_func(param):
# Do Chrome stuff
pool = Pool(80)
# For each parameter, add two tasks to the pool one FF, one Chrome.
for param in params:
pool.apply_async(ff_func, param)
pool.apply_async(ch_func, param)
pool.close()
pool.join()
</code></pre>
<hr/>
<p>这里的情况是,您构建了一个大的异步任务队列供池处理。然后,池按照它认为合适的顺序处理所有定义的任务。在</p>
<p>请注意,与前面的答案不同,这实际上不能保证每个浏览器的最大池大小为40,因为您要求我们更好地利用我们的资源。使用我们最多80个进程的最佳方法是尽可能让它们一直工作。在</p>
<p>如果不能同时为这两种“类型”中的任何一种使用超过40个进程,那么就无法从以前开始真正改进双池方法。在这种情况下,您的瓶颈仅仅是40个进程完成一个或另一个队列的速度。如果不允许使用更快队列中的空闲进程,则无法使用它们;-)</p>