如何实现python multiprocessing.Pool的自定义控件?

时间:2014-10-23 18:10:21

标签: python python-2.7 selenium multiprocessing selenium-grid

通常我使用下面的代码,当你无关紧要函数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,其中一些并不重要。

例如,假设我们有以下类型:

  • 类型firefox:最大同时数:40
  • type chrome:最大同时数:40

在这种情况下,我们的游泳池将有最多80个同时进程,但有严格的规则:其中40个必须是firefox,其中40个必须是chromes。

这意味着params不会一个接一个地被带走。池必须从params列表中选择值,以使每种流程类型具有最大值。

如何实现这一目标?

1 个答案:

答案 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个工作进程。