我需要在 django 中生成一个后台进程,视图立即返回,后台进程继续进行一些更改,然后更新数据库。这是通过os.spawnl()
调用单独的 .py 文件的函数来完成的。
问题是后台进程完成后,变成了僵尸函数[python] <defunct>
。
我该如何避免呢?我遵循了这个和这个例子,但在 django 渲染过程之后我仍然把子进程作为僵尸。
我想借此机会练习我的 *nix 进程管理技能,所以请帮我一个忙,不要给我 Celery 或其他 mq/async 任务解决方案,我讨厌依赖。
这很长一段时间的评论 -
系统wait
调用(它os.wait
是一个包装器)从死进程中获取退出代码/pid。您将希望os.wait
在您的僵尸进程之上一代的进程中;僵尸进程的父进程。SIGCHLD
当其子进程之一死亡时,父进程将收到一个信号。如果您坚持自己做所有这些,您将需要安装一个信号处理程序来捕获SIGCHLD
信号处理程序调用和在信号处理程序调用os.wait
中。阅读有关 unix 进程处理的一些文档和os
模块上的 Python 文档,因为该函数的变体os.wait
将是非阻塞的,这可能会有所帮助。
import signal
signal.signal(signal.SIGCHLD, lambda _x,_y: os.wait())
我有一个类似的问题。我使用了多处理模块中的 active_children() 。
import multiprocessing
# somewhere in middleware or where appropriate call
active_children()