我正在使用python 2.7.10。 我读了很多文件,将它们存储到一个大的列表中,然后尝试调用多处理并将大列表传递给那些多进程,这样每个进程都可以访问这个大的列表并进行一些计算。
我正在使用像这样的游泳池:
def read_match_wrapper(args):
args2 = args[0] + (args[1],)
read_match(*args2)
pool = multiprocessing.Pool(processes=10)
result=pool.map(read_match_wrapper,itertools.izip(itertools.repeat((ped_list,chr_map,combined_id_to_id,chr)),range(10)))
pool.close()
pool.join()
基本上,我将多个变量传递给' read_match'功能。为了使用pool.map,我写了#read_match_wrapper'功能。我不需要从这些流程中获得任何结果。我只是想让他们跑步和完成。
我可以在我的数据列表' ped_list'很小。当我加载所有数据(如10G)时,它生成的所有多进程都会显示' S'似乎根本不起作用..
我不知道您可以通过池访问多少数据? 我真的需要帮助!谢谢!
答案 0 :(得分:3)
从多处理编程指南中:
避免共享状态
As far as possible one should try to avoid shifting large amounts of data between processes.
您患有的是一个完整管道的典型症状,它不会被排出。
Pool使用的Python multiprocessing.Pipe存在一些设计缺陷。它基本上在OS管道上实现了一种面向消息的协议,它更像是一个流对象。
结果是,如果你通过Pipe发送一个太大的对象,它将被填充。发件人无法向其添加内容,并且接收者无法在其等待邮件结束时被阻止。
证明你的工人正在等待那个"胖"从未到过的信息。
ped_list是否包含文件名或文件内容?
在第二种情况下,您宁愿发送文件名而不是内容。工作人员可以使用简单的open()来检索内容。
答案 1 :(得分:0)
我宁愿使用队列,而不是使用pool.map
。您可以生成所需数量的进程并为输入分配队列:
n = 10 #number of processes
tasks = multiprocessing.Queue()
for i in range(n): #spawn processes
multiprocessing.Process(target = read_match_wrapper, args = tasks)
for element in ped_list:
tasks.put(element)
通过这种方式,您的队列从一侧填充,同时从另一侧清空。也许有必要在进程启动之前将一些东西放入队列中。由于队列为空或引发Queue.empty异常,因此它们有可能在没有做任何事情的情况下结束。