V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
xanpeng
V2EX  ›  Python

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

  •  
  •   xanpeng · 2015-05-02 23:44:10 +08:00 · 3077 次点击
    这是一个创建于 3499 天前的主题,其中的信息可能已经有所发展或是发生改变。

    大家好,求助如题的问题,问题详述:
    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()会通过?

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1011 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 19:48 · PVG 03:48 · LAX 11:48 · JFK 14:48
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.