我正在使用multiprocessing
,特别是Pool
来剥离几个“线程”来完成我所拥有的一系列缓慢的工作。但是,出于某种原因,即使所有的孩子都死了,我也无法让主线重新加入。
已解决:似乎这个问题的答案是只发射多个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,它也不是孩子。
有谁知道我不知道的事情?
我没有真正的答案,但我阅读了Apply_async的文档,这似乎与你陈述的问题背道而驰......
回调应立即完成,否则处理结果的线程将被阻止。
我不熟悉Pool,但在我看来,你的用例可以通过Python Module of the Week上的这个配方轻松处理