我正在使用multiprocessing,特别是Pool来剥离几个“线程”来完成我的许多缓慢工作。但是,由于某些原因,即使所有 child 似乎都已死亡,我也无法使主线程重新加入。

解决:这个问题的答案似乎是只是启动多个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上的此食谱轻松处理您的用例

关于python - Python多重处理永远不会加入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9236958/

10-10 23:35
查看更多