繁体   English   中英

使用python多处理库让父进程在子进程之前返回

[英]Let parent process return before child process using python multiprocessing library

当一个人使用python从多处理库创建Processes时,父进程会等待其子进程返回,然后再返回。 实际上,文档建议加入所有子级。 但是我想让父项子项处理完成之前返回。

有什么办法可以“分离”子进程。

我知道使用subprocess.Popen可以创建分离的子进程,但是我想使用多处理库中的功能,例如队列,锁等。

我举了两个例子来说明差异。

第一个示例使用多处理库。 调用此脚本时,它将打印父消息,等待5秒钟,打印子消息,然后才返回。

# Using multiprocessing, only returns after 5 seconds
from multiprocessing import Process
from time import sleep, asctime

def child():
    sleep(5.0)
    print 'Child end reached on', asctime()

if __name__ == '__main__':
    p = Process(target = child)
    p.start()
    # Detach child process here so parent can return.
    print 'Parent end reached on', asctime()

第二个示例使用subprocess.Popen。 调用此脚本时,它将打印父消息,返回(!!!),并在5秒钟后打印子消息。

# Using Popen, returns immediately.
import sys
from subprocess import Popen
from time import sleep, asctime

def child():
    sleep(5)
    print 'Child end reached on', asctime()

if __name__ == '__main__':
    if 'call_child' in sys.argv:
        child()
    else:
        Popen([sys.executable] + [__file__] + ['call_child'])
        print 'Parent end reached on', asctime()

如果我可以传递队列,管道,锁,信号量等,则第二个示例是可以接受的。

IMO,第一个示例也导致了更简洁的代码。

我在Windows上使用python 2.7。

只需从当前流程对象的_children集合中删除流程对象,父流程将立即退出。

多重处理模块管理私有集中的子进程,并在当前进程退出时将其加入。 如果您不关心儿童,则可以将其从集合中删除。

process = multiprocessing.Process(target=proc_main)
multiprocessing.current_process()._children.discard(process)
exit(0)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM