gpt4 book ai didi

python - mod_wsgi 不允许子进程退出

转载 作者:太空宇宙 更新时间:2023-11-03 17:06:41 26 4
gpt4 key购买 nike

我使用 CherryPy、Apache 和 mod_wsgi 构建了一个网站,除了一个问题之外,一切都很好。当用户操作要求自动发送电子邮件时,我有时会使用 os.fork ,以便父进程可以立即返回并向用户提供“OK”消息,而子进程则在发送电子邮件的费用(可能需要几秒钟,我不希望用户必须等待)。

当子进程完成其工作并调用sys.exit()时,就会出现问题。 mod_wsgi 似乎捕获了 SystemExit 异常,将回溯转储到我的 Apache 错误日志中,并保持子进程运行。我对此有两个问题:

  1. 它使 Apache 错误日志变得困惑,其回溯并不代表任何实际错误,并且

  2. 它会让进程继续运行,浪费系统资源。更糟糕的是,随着时间的推移,这些 sleep 进程中有多少会累积?

郑重声明,Apache 错误日志中的输出如下所示:

mod_wsgi (pid=14900): SystemExit exception raised by WSGI script '/Users/me/myscript.py' ignored.

随后是导致 sys.exit() 调用的回溯。

我猜this解释了为什么 mod_wsgi 捕获 SystemExit 异常,但这对我没有帮助。

如果有一种方法可以配置 mod_wsgi 的行为,那就太好了,但是当我在 the docs 中搜索“SystemExit”和“sys.exit”时,没有人发现任何结果。

在此站点上搜索“mod_wsgi SystemExit”仅产生六个帖子,并且没有一个帖子询问如何允许子进程退出。

有谁知道如何让子进程真正退出,并使 mod_wsgi 不将任何内容转储到 Apache 错误日志中?

最佳答案

一般来说,您不应在托管于非您创建的服务器进程中的代码中使用 fork()。它通常会导致奇怪的流程生命周期问题,类似于您在此处描述的问题。 (这超出了 Apache、WSGI 或 Python;它适用于各种各样的情况。)

如果可以选择,我建议使用单独的工作队列来处理异步任务。对于 Python,一个常用选项是 Celery .

如果这绝对不是一个选项,您可以通过调用 os._exit() 绕过 SystemExit 异常并在 Python 中立即退出。但是,请注意,这仍然可能会导致一些奇怪的行为,我不会推荐它。

关于python - mod_wsgi 不允许子进程退出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34503793/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com