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

2023-02-22 02:08:45 +08:00
 Richard14

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

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

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

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

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


@wheeler 直接用三方程序的话有一个问题就是三方程序只能监管一个进程的资源,比如我一个绑定 10086 端口的服务有 10 个 fork 进程,这些子进程应该是监控不到,只有主进程挂了三方监控才会重新拉起吧?如果直接开 10 个主进程的话,没办法绑定到同一监听端口啊
ClericPy
2023-02-22 18:38:13 +08:00
进程不是有 wait 么, 不能用 wait 吗... 我管理几十个 chrome 进程用的就是 wait, 看它的 return code 就知道是不是正常退出, 而且反应速度也挺不错的. 不放心再加个验活就好了, 验活可以用 poll 也可以用 os.kill 0 的方式
julyclyde
2023-02-23 09:37:37 +08:00
@Richard14 进程如果退出的话,其父进程是可以收到信号的。不是子进程发的,是操作系统发的
如果是卡死啦那就没信号
你可能需要一个 timeout 或者 watchdog 机制?

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

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

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

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

© 2021 V2EX