【问题标题】:How to implement custom control over python multiprocessing.Pool?如何实现对 python multiprocessing.Pool 的自定义控制?
【发布时间】:2014-10-23 18:10:20
【问题描述】:

通常我使用以下代码,当您不关心函数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。但是.. 假设我们有不同类型的进程(参数),应该同时执行。例如,在我的 selenium 网格中,我有 40 个 firefox,40 个 chrome。而且我有 5000 个测试用例,其中一些更喜欢 chrome,其中一些更喜欢 firefox,其中一些无关紧要。

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

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

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

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

如何做到这一点?

【问题讨论】:

  • 有理由不简单地使用两个池和两个输入列表吗?

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


【解决方案1】:

我会修改您的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 个工作进程。

【讨论】:

  • 嗯,哇,这两个池将在一个主进程中同时工作?
  • 嗯...以及我如何控制没有首选类型(浏览器)的测试?事实上,他们应该使用加载较少的浏览器类型。
  • 我不确定您所说的“一个主进程”是什么意思,但这与调用Pool(80) 几乎相同。您只是对使用特定浏览器的每个功能的可用工作人员数量进行了限制。
  • 当您使用地图时,池的“加载”没有太大差异。您指定的进程数量被分拆并给定一个队列。所有作业都一次性提交到该队列。当每个进程完成一项工作时,它会从队列中获取下一项。在队列中剩余的项目数量少于工人数量之前,实际上没有任何停机时间。要获得所需的控制,您必须使用 apply_async() 之类的东西并手动控制何时提交作业,并找到一种动态调整它的方法。
  • 此外,即使您可以一次启动 20 个池,但这并不意味着您应该这样做。许多池的“需求”表明(对我而言)脚本的整体结构可能需要一些工作。一旦你的代码工作起来,考虑前往Code Review 以获取其他人的意见。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-06
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
相关资源
最近更新 更多