python / django生成后台进程并避免僵尸进程

时间:2012-11-06 09:21:28

标签: python django linux fork zombie-process

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

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

我该如何避免?我遵循了thisthis示例,但在django渲染过程之后,我仍然将子进程视为僵尸。

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

2 个答案:

答案 0 :(得分:2)

这需要很长时间才能发表评论 -

wait系统调用(os.wait是一个包装器)从死进程中获取退出代码/ pids。在僵尸进程之上的一代中,您将需要os.wait;僵尸进程的父级。当其中一个子进程死亡时,父进程将收到SIGCHLD信号。如果您坚持自己完成所有这些操作,则需要安装一个信号处理程序来陷阱SIGCHLD并在信号处理程序中调用os.wait。阅读有关unix进程处理的一些文档和os模块上的Python文档,因为os.wait函数的变体将是非阻塞的,这可能会有所帮助。

import signal
signal.signal(signal.SIGCHLD, lambda _x,_y: os.wait())

答案 1 :(得分:0)

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

import multiprocessing

# somewhere in middleware or where appropriate call
active_children()