Django:服务器退出时如何运行函数?


问题内容

我正在编写一个Django项目,其中使用Popen打开了多个进程。现在,当服务器退出时,这些进程将被孤立。我有一个终止这些进程的功能,并且希望对其进行组织,以便在服务器退出时自动调用此功能。

任何帮助将不胜感激。


问题答案:

由于您尚未指定要使用的HTTP服务器(uWSGI,nginx,apache等),因此可以在简单的dev服务器上测试此配方。

您可以尝试通过atexit在进程终止时调用的模块注册清除功能。您可以通过覆盖django的内置runserver命令轻松地做到这一点。

创建一个名为 runserver.py 的文件,并将其放在$PATH_TO_YOUR_APP/management/commands/目录中。

假设PROCESSES_TO_KILL有一个全局列表,其中包含对孤立进程的引用,这些引用将在服务器终止时终止。

import atexit
import signal
import sys

from django.core.management.commands.runserver import BaseRunserverCommand

class NewRunserverCommand(BaseRunserverCommand):
    def __init__(self, *args, **kwargs):
        atexit.register(self._exit)
        signal.signal(signal.SIGINT, self._handle_SIGINT)
        super(Command, self).__init__(*args, **kwargs)

    def _exit(self):
        for process in PROCESSES_TO_KILL:
            process.terminate()

    def _handle_SIGINT(signal, frame):
        self._exit()
        sys.exit(0)

请注意,这对于正常终止脚本非常有用,但是在所有情况下都不会调用它(例如致命的内部错误)。

希望这可以帮助。