我使用的是python2.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”函数。为了使用池.map,我编写了“read_match_wrapper”函数。我不需要这些过程的任何结果。我只想让他们跑完全程。在
当我的数据列表“ped_list”很小时,我就可以完成整个过程的工作。当我加载所有数据时,比如10G,那么它生成的所有多进程都会显示“S”,而且似乎根本不起作用。。在
我不知道通过池访问的数据量是否有限制? 我真的需要帮助!谢谢!在
根据多处理编程指南:
你所遭受的是一个典型的症状,一个充满的管道,没有排水。在
Python多处理.管道游泳池使用的有一些设计缺陷。它基本上在一个操作系统管道上实现了一种面向消息的协议,更像是一个流对象。在
结果是,如果你把一个太大的物体通过管道,它就会被塞住。发送方将无法向其添加内容,接收方也无法将其排出,因为它在等待消息结束时被阻止。在
证据是,你的员工在睡觉,等待着那条永远不会到来的“肥肉”信息。在
ped_list是否包含文件名或文件内容?在
在第二种情况下,您宁愿发送文件名而不是内容。工作人员可以使用简单的open()自己检索内容。在
我宁愿使用队列,而不是使用
pool.map
。您可以生成所需数量的进程并为输入分配队列:这样,您的队列将从一侧填充,同时从另一侧清空。在进程开始之前,可能有必要在队列中放入一些东西。当队列为空或引发一个队列.empty-例外情况。在
相关问题 更多 >
编程相关推荐