如何在python multiprocessing.Pool上实现自定义控件?
通常我使用以下代码,当您不在乎哪个顺序函数如何在python multiprocessing.Pool上实现自定义控件?,python,python-2.7,selenium,multiprocessing,selenium-grid,Python,Python 2.7,Selenium,Multiprocessing,Selenium Grid,通常我使用以下代码,当您不在乎哪个顺序函数process\u func将处理某些参数时,它可以正常工作: params = [1,2,3,4,5 ... ] def process_func(): ... pool = new Pool(40) pool.map(process_func, params) pool.close() pool.join() 在上面的例子中,我们有一种类型的进程,最大同时数为40。但是假设我们有不同类型的进程(参数),它们应该同时执行。例如,在我的se
process\u 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,一些并不重要
例如,假设我们有以下类型:
- firefox类型:最大同时数:40
- 类型:最大同时数:40
如何实现这一点?我将修改您的
进程\u func()
以获取更多的参数,该参数告诉它将是哪个“类型”,并使用两个单独的池。添加将允许我们仍然使用pool.map()
:
functools.partial()
函数允许我们通过返回一个始终提供参数的新函数对象,将参数绑定到一个特定的值。这种方法允许您将每个“类型”(缺少更好的术语)限制为40个工作进程。有没有理由不简单地使用两个池和两个输入列表?嗯,哇,这两个池将在一个主进程中同时工作?嗯。。。我如何控制没有首选类型(浏览器)的测试?事实上,他们应该使用较少加载的浏览器类型。我不确定“一个主进程”是什么意思,但这与调用Pool(80)
几乎是一样的。您只是对使用特定浏览器的每个函数的可用工作线程数进行了限制。使用map时,池的“加载”没有太大差异。您指定的进程数将被剥离并提供一个队列。所有作业一次提交到该队列。当每个进程完成一个作业时,它会从队列中获取下一个作业。在队列中剩余的项目数小于工作人员数之前,实际上没有任何停机时间。要获得所需的控制,您必须使用类似于apply\u async()
的方法,并实现您自己的手动控制,以控制提交作业的时间,并找到一种动态调整的方法。此外,即使您一次可以启动20个池,但这并不意味着您应该这样做。对这么多池的“需要”(对我来说)表明,脚本的整体结构可能需要一些工作。一旦你的代码工作了,就考虑向其他人输入它的代码。
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()