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
Richard14
V2EX  ›  Python

Python 多进程:有什么主进程守护子进程的方法吗?

  •  
  •   Richard14 · 2023-02-22 02:08:45 +08:00 · 1938 次点击
    这是一个创建于 670 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如用 socket 在某端口绑定了一个监听服务,然后用 os.fork 分裂出多个节点。

    如果其中一个进程挂了,这种情况下主进程有什么办法可以监控和恢复吗?

    10 条回复    2023-02-23 09:37:37 +08:00
    ysc3839
        1
    ysc3839  
       2023-02-22 02:33:48 +08:00 via Android
    SIGCHLD
    mingl0280
        2
    mingl0280  
       2023-02-22 04:05:35 +08:00 via Android
    fork 完了有 pid 的,直接拉 pid 列表看看是不是死了呗
    ruanimal
        3
    ruanimal  
       2023-02-22 07:52:35 +08:00
    其实好奇,既然你想自己 fork 那么你就用 c 的写法啊,为啥有这个问题呢?

    或者用 ForkingTCPServer
    wheeler
        4
    wheeler  
       2023-02-22 08:12:55 +08:00 via iPhone
    不能直接 supervisord systemd 吗
    julyclyde
        5
    julyclyde  
       2023-02-22 08:37:23 +08:00
    你自己 fork 那就只能自己 SIGCHLD 了
    ForkingTCPServer 、ThreadPoolExecutor 之类的都是作一些简化,但是本质上还是一样的
    rationa1cuzz
        6
    rationa1cuzz  
       2023-02-22 09:12:37 +08:00
    我们以前是起个线程去看,挂了化去重新拉起来
    lolizeppelin
        7
    lolizeppelin  
       2023-02-22 10:14:53 +08:00   ❤️ 1
    对 linux 不够熟不要自己写一套

    最佳实践参考 openstack 服务库的 oslo_service
    里面有 linux 下多进程的标准管理方式以及可用代码
    Richard14
        8
    Richard14  
    OP
       2023-02-22 14:33:07 +08:00
    @ysc3839
    @mingl0280
    @ruanimal
    @julyclyde
    @rationa1cuzz
    @lolizeppelin 感谢回复,我目前其实没把进程玩挂过,前端加了限峰,只是考虑作为一个长期运行撒手不管的服务的话,我没法预期它会不会有什么期望外的行为,想做比较成熟的应用的话应该考虑挂了拉起的情况。但是听各位说的感觉似乎是主进程会接收子进程挂起信号,但是我不太了解比如 win 平台下进程挂了就是未响应,这种进程还会发信号吗?另外如果参考 linux 下其他代码的话,毕竟这是 python 程序。。叫我参考 C 的代码我不太懂两者怎么结合起来。


    @wheeler 直接用三方程序的话有一个问题就是三方程序只能监管一个进程的资源,比如我一个绑定 10086 端口的服务有 10 个 fork 进程,这些子进程应该是监控不到,只有主进程挂了三方监控才会重新拉起吧?如果直接开 10 个主进程的话,没办法绑定到同一监听端口啊
    ClericPy
        9
    ClericPy  
       2023-02-22 18:38:13 +08:00
    进程不是有 wait 么, 不能用 wait 吗... 我管理几十个 chrome 进程用的就是 wait, 看它的 return code 就知道是不是正常退出, 而且反应速度也挺不错的. 不放心再加个验活就好了, 验活可以用 poll 也可以用 os.kill 0 的方式
    julyclyde
        10
    julyclyde  
       2023-02-23 09:37:37 +08:00
    @Richard14 进程如果退出的话,其父进程是可以收到信号的。不是子进程发的,是操作系统发的
    如果是卡死啦那就没信号
    你可能需要一个 timeout 或者 watchdog 机制?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1074 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 23:30 · PVG 07:30 · LAX 15:30 · JFK 18:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.