Skip to main content
 首页 » 编程设计

Python 多处理从不加入

2025年05月04日10Terrylee

我正在使用 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 个 child 的日志文件的输出是:

Spawned 
Complete 
Entered function 
Exiting 

主线程打印'Waiting for jobs to terminate',然后就坐在那里。

top 只显示脚本的一个副本(我相信是主要的)。 htop 显示了两个副本,其中一个是顶部的,另一个是其他的。根据它的 PID,它也不是 child 。

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

请您参考如下方法:

我真的没有答案,但我阅读了 Apply_async 的文档,它似乎与您提出的问题背道而驰...

Callbacks should complete immediately since otherwise the thread which handles the results will get blocked.

我对 Pool 不熟悉,但在我看来,您的用例可以很容易地通过 Python Module of the Week 上的这个食谱来处理。