Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在python multiprocessing.Pool上实现自定义控件?_Python_Python 2.7_Selenium_Multiprocessing_Selenium Grid - Fatal编程技术网

如何在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
在这种情况下,我们的池最多有80个并发进程,但有一条严格的规则:其中40个必须是firefox,40个必须是chromes

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


如何实现这一点?

我将修改您的
进程\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()