2012-11-06 57 views
1

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

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

我该如何避免这种情况?我遵循thisthis的例子,但在django渲染过程之后,我仍然将子进程看作僵尸。

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

+1

http://docs.python.org/2/library/os.html#os.wait – tMC

+0

@tMC感谢,我应该'os.wait()'的子进程或孙子进程? – est

回答

2

这得长为comment-

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()) 
+0

问题是,signal.signal只能在主线程中使用,而django喜欢将该线程保留给自己。否则,你可以只做signal.signal(signal.SIGCHLD,signal.SIG_IGN),它不会将死进程留作僵尸。 – user2183078

0

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

​​