Python多处理永远不会加入

时间:2012-02-11 01:18:36

标签: python multithreading process multiprocessing pool

我正在使用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,它也不是孩子们。

有人知道我不知道的事吗?

1 个答案:

答案 0 :(得分:1)

我真的没有答案,但我读了Apply_async的文档,这似乎与你陈述的问题背道而驰......

  

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

我对游泳池并不熟悉,但在我看来,您的用例可以通过Python Module of the Week上的这个食谱轻松处理