python多处理,大数据将进程转变为睡眠状态

时间:2015-07-02 19:50:26

标签: python multiprocessing bigdata sleep pool

我正在使用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'似乎根本不起作用..

我不知道您可以通过池访问多少数据? 我真的需要帮助!谢谢!

2 个答案:

答案 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异常,因此它们有可能在没有做任何事情的情况下结束。