【问题标题】:python/django spawn background process and avoid zombie processpython/django 生成后台进程并避免僵尸进程
【发布时间】:2012-11-06 09:21:28
【问题描述】:

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

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

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

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

【问题讨论】:

标签: python django linux fork zombie-process


【解决方案1】:

这篇评论太久了-

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

【讨论】:

  • 问题是 signal.signal 只在主线程中有效,而 django 喜欢把那个线程留给自己。否则,你可以做 signal.signal(signal.SIGCHLD, signal.SIG_IGN) 不会让死进程成为僵尸。
【解决方案2】:

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

import multiprocessing

# somewhere in middleware or where appropriate call
active_children()

【讨论】:

    猜你喜欢
    • 2011-09-20
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多