【发布时间】:2018-06-30 00:01:57
【问题描述】:
我无法理解如何在下面的多处理示例中实现队列。基本上,我希望代码:
1) 产生 2 个进程(完成)
2) 将我的 id_list 分成两部分(完成)
3) 让每个进程遍历列表并打印出每个项目,并且仅在完成列表后关闭。我知道我必须实现某种类型的排队系统,并将其传递给每个工人,但我不知道该怎么做。任何帮助将不胜感激。
from multiprocessing import Pool,Queue
id_list = [1,2,3,4,5,6,7,8,9,10]
def mp_worker(record):
try:
print record
sleep(1)
except: pass
print "worker closed"
def mp_handler():
p = Pool(processes = 2) #number of processes
p.map(mp_worker, id_list) #devides id_list between 2 processes, defined above
p.close()
p.join()
mp_handler()
注意 - 代码会打印 10 次“工人已关闭”。我希望这条语句只打印两次(每个工人一次,在每个工人从 id_list 打印出 5 个数字之后)
【问题讨论】:
-
出于好奇,您是否需要自己的任务队列/分块实现而不是
pool.map已经为您提供的实现? -
该代码是使用 selenium webdriver 的刮板(工作者)的精简版本 - 当我使用 pool.map 时,我已经不知道如何将队列中的项目分配给一个打开 webdriver(每个工作人员)。队列项目将被分配给 webdriver,webdriver 将打开,处理队列项目,关闭......然后工作人员将再次重新启动 - 这会降低我的性能,因为我必须为每个队列项目启动 webdriver。使用下面的解决方案,我可以为每个工作人员启动一次 webdriver,然后将队列项传递给它。让我知道是否有更好的方法。
-
查看我的答案——工作进程与池一样长。如果工人正在重新启动,那是因为您正在关闭并重建池。
-
如果问题在于保持 Web 驱动程序进程处于打开状态,您可以通过将 init 从函数本身移出并进入模块的顶层来实现。然后它将为每个池工作人员运行一次。
-
问题是队列项一个接一个地传递给每个工作人员的网络驱动程序,而它是打开的。下面的解决方案完全符合我的要求。经过测试并按预期工作
标签: python queue multiprocessing