我使用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,它也不是孩子。
有人知道我没有的东西吗?
为什么你的'sys.exit(0)'有处理?让该函数返回。 – Amber 2012-02-11 01:28:12
我试图确保他们都退出了,因为这个问题。我没有尝试过。 – Chris 2012-02-11 03:07:37