我正在编写一个Django项目,其中使用Popen打开了几个进程。现在,当服务器退出时,这些进程是孤立的。我有一个函数来终止这些进程,我希望组织它,以便在服务器退出时自动调用此函数。
非常感谢任何帮助。
答案 0 :(得分:3)
由于您还没有指定您正在使用的HTTP服务器(uWSGI,nginx,apache等),您可以在简单的开发服务器上测试此配方。
您可以尝试通过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)
请注意,这对于正常终止脚本非常有用,但在所有情况下都不会被调用(例如,致命的内部错误)。
希望这有帮助。
答案 1 :(得分:0)
首先,“当服务器退出时”是不明确的。响应请求时这些东西会运行吗?这个东西在管理命令期间运行吗?
让我们假设您在视图中运行它,因此您希望在每个视图返回后运行一些东西,以便清理视图留下的垃圾。
最有可能的是,你要做的是写一些Middleware。更具体地说,某种process_response。
但是,根据您到目前为止的简短描述,您更有可能使用某个任务管理器,例如Celery
来管理异步任务和进程。