1

我需要在 django 中生成一个后台进程,视图立即返回,后台进程继续进行一些更改,然后更新数据库。这是通过os.spawnl()调用单独的 .py 文件的函数来完成的。

问题是后台进程完成后,变成了僵尸函数[python] <defunct>

我该如何避免呢?我遵循了这个这个例子,但在 django 渲染过程之后我仍然把子进程作为僵尸。

我想借此机会练习我的 *nix 进程管理技能,所以请帮我一个忙,不要给我 Celery 或其他 mq/async 任务解决方案,我讨厌依赖。

4

2 回答 2

2

这很长一段时间的评论 -

系统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())
于 2012-11-08T13:55:48.757 回答
1

我有一个类似的问题。我使用了多处理模块中的 active_children() 。

import multiprocessing

# somewhere in middleware or where appropriate call
active_children()
于 2015-04-15T23:19:35.620 回答