通常我使用下面的代码,当你无关紧要函数process_func
将处理某个参数时,它可以正常工作:
params = [1,2,3,4,5 ... ]
def process_func():
...
pool = new Pool(40)
pool.map(process_func, params)
pool.close()
pool.join()
在上面的示例中,我们有一个类型的进程,最大同时数为40.但是......想象我们有不同类型的进程(参数),应该同时执行。例如,在我的硒网格中,我有40个firefox,40个chromes。我有5000个测试用例,其中一些更喜欢chrome,其中一些是firefox,其中一些并不重要。
例如,假设我们有以下类型:
在这种情况下,我们的游泳池将有最多80个同时进程,但有严格的规则:其中40个必须是firefox,其中40个必须是chromes。
这意味着params不会一个接一个地被带走。池必须从params列表中选择值,以使每种流程类型具有最大值。
如何实现这一目标?
答案 0 :(得分:2)
我会修改你的process_func()
以获取一个参数,告诉它哪个“类型”并使用两个单独的池。添加functools.partial将允许我们仍然使用pool.map()
:
from functools import partial
from multiprocessing import Pool
params = [1,2,3,4,5 ... ]
def process_func(type, param):
if type == 'Firefox':
# do Firefox stuff
else:
# do Chrome stuff
chrome_pool = Pool(40)
fox_pool = Pool(40)
chrome_function = partial(process_func, 'Chrome')
fox_function = partial(process_func, 'Firefox')
chrome_pool.map(chrome_func, params)
fox_pool.map(fox_func, params)
chrome_pool.close()
fox_pool.close()
chrome_pool.join()
fox_pool.join()
functools.partial()
函数允许我们通过返回一个始终提供该参数的新函数对象,将参数绑定到特定值。这种方法允许您将每个“类型”(缺少更好的术语)限制为40个工作进程。