信号会影响 multiprocessing join()的行为?

2015-05-02 23:44:10 +08:00
 xanpeng

大家好,求助如题的问题,问题详述:
1.python主进程中利用multiprocessing.Process创建多个子进程,并为子进程设置signal handler,具体做法大致如下:

def spawn_child(sighandler, func, *args):
    class _Wrapper(multiprocessing.Process):
        def run(self):
            signal.signal(signal.SIGINT, sighandler)
            signal.signal(signal.SIGTERM, sighandler)
            multiprocessing.Process.run(self)
    proc = _Wrapper(target=func, args=args)
    proc.daemon = True
    proc.start()

2.主进程也利用signal.signal()设置了signal handler。
3.主进程不做实质工作,仅利用child0.join() + child1.join()等待子进程结束。
3.运行程序,产生主进程和子进程(2个)。
4.此时我只向主进程发送SIGINT。主进程sig handler捕获SIGINT,然后忽略该SIGINT。(此时子进程sig handler并为接收到此SIGINT,因为没有对应log输出)。

奇怪之处(以我目前的认知...)在于,log显示主进程此时执行完毕child0.join()

5.我重复上一步,再次发送SIGINT,同样的日志输出。同样的”奇怪之处“:log显示主进程执行完毕child1.join()。

在两个join()完毕后,主进程退出,子进程自动接收到SIGTERM信号,于是主进程和子进程都终止。

请问为什么主进程信号处理后子进程.join()会通过?

3099 次点击
所在节点    Python
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/188028

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX