我需要在django中生成后台进程,视图立即返回,后台进程继续进行一些更改,然后更新数据库。这是由os.spawnl()
函数完成的,用于调用单独的.py文件。
问题是在后台进程完成后,它成为僵尸函数[python] <defunct>
。
我该如何避免?我遵循了this和this示例,但在django渲染过程之后,我仍然将子进程视为僵尸。
我想借此机会练习我的* nix流程管理技能,所以请帮我个忙,不要给我Celery或其他mq /异步任务解决方案,我讨厌依赖。
答案 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()