2012-02-11 53 views
2

我使用multiprocessing,特别是Pool来剥离几个'线程'来做一堆我有的慢速作业。但是,由于某种原因,即使所有的孩子似乎已经死亡,我也无法让主线重新加入。Python多处理永远不会加入

解决的问题:出现这个问题的答案是刚刚启动多个Process对象,而不是使用Pool。目前还不清楚为什么,但我怀疑剩下的过程是一个池的管理者,当这些过程完成时它不会死亡。如果其他人有这个问题,这是答案。


主线

pool = Pool(processes=12,initializer=thread_init) 
for x in xrange(0,13): 
    pool.apply_async(thread_dowork) 
pool.close() 
sys.stderr.write("Waiting for jobs to terminate\n") 
pool.join() 

xrange(0,13)比的进程数多一个,因为我觉得我被一个有一个关闭,一个过程,不是找工作,所以并没有死去,我想迫使它找份工作。我也尝试过12。

多重功能

def thread_init(): 
    global log_out 
    log_out = open('pool_%s.log'%os.getpid(),'w') 
    sys.stderr = log_out 
    sys.stdout = log_out 
    log_out.write("Spawned") 
    log_out.flush() 
    log_out.write(" Complete\n") 
    log_out.flush() 


def thread_dowork(): 
    log_out.write("Entered function\n") 
    log_out.flush() 
    #Do Work 
    log_out.write("Exiting ") 
    log_out.flush() 
    log_out.close() 
    sys.exit(0) 

日志文件的所有12个孩子的输出是:

Spawned 
Complete 
Entered function 
Exiting 

主线程打印“等待作业结束”,然后就坐在那里。

top只显示脚本的一个副本(我相信的主要副本)。 htop显示两个副本,其中之一是从顶部的一个,另一个是另一个。基于它的PID,它也不是孩子。

有人知道我没有的东西吗?

+1

为什么你的'sys.exit(0)'有处理?让该函数返回。 – Amber 2012-02-11 01:28:12

+0

我试图确保他们都退出了,因为这个问题。我没有尝试过。 – Chris 2012-02-11 03:07:37

回答

1

我真的不知道答案,但我阅读Apply_async的文档,并将其柜台似乎与贵公司所提的问题...

回调应立即完成,因为否则其 处理结果将线程被阻止。

我不熟悉的游泳池,但在我看来,你的用例可以很容易地通过这个食谱上Python Module of the Week

+0

正确...'apply_async'应该完全符合我的要求。池被记录[在这里](http://docs.python.org/library/multiprocessing.html),但是我会给'Process'方法一个镜头,因为'Pool'似乎没有工作。 – Chris 2012-02-11 03:16:26

+0

祝你好运!我也想知道,如果你已经尝试加入()最后一个过程... – 2012-02-11 04:33:46

+0

我会给你点头的答案,因为它似乎将所有切换到'Process'而不是使用'Pool'固定问题。我仍然不确定这是为什么,但它现在起作用。 – Chris 2012-02-13 15:16:34

相关问题