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)
请注意,这对于正常终止脚本非常有用,但是在所有情况下都不会调用它(例如致命的内部错误)。
希望这可以帮助。