Django应用程序自定义清理以重新加载代码



我的Django项目有一个覆盖其AppConfig.ready()方法的应用程序。在ready方法中,我启动了一个单独的multiprocessing.Process来处理来自外部消息队列的消费,这似乎会导致代码更改的自动读取问题。

def infinite_loop():
while True:
time.sleep(10)

class BrokerConfig(AppConfig):
name = 'backend.broker'
has_started = False
def ready(self):
if not os.environ.get("RUN_MAIN"):
# Avoid running for reloader
return
if BrokerConfig.has_started:
return
BrokerConfig.has_started = True
proc = Process(target=infinite_loop)
proc.start()

无论出于何种原因,这都会导致自动代码重新加载中断。似乎重新加载程序无法清理已启动的进程。重装机打印出这个,然后卡住了:

.../backend/broker/apps.py changed, reloading.

解决这个问题的一种方法是将启动的进程设置为守护进程,但如果这样的设置不可能,我仍然很好奇如何解决这个问题。

当重新加载时,我正在寻找一些添加自定义清理的方法,但我似乎找不到这样做的方法。是否有一些钩子或信号可以订阅,以了解是否触发了重新加载?

我设法用另一种方式来做这件事,所以我没有监听或挂接到一些Django信号来指示"代码重新加载输入";,我在SIGTERM的启动过程中添加了一个监听器。当重新加载发生时,代码重新加载将导致守护进程终止,从而接收SIGTERM信号。我没有找到一种方法来处理非守护进程。

最终解决方案

def infinite_loop():
stop = False
def stop():
nonlocal stop
stop = True
signal.signal(signal.SIGTERM, stop)
while True:
if stop:
break
time.sleep(10)
class BrokerConfig(AppConfig):
name = 'backend.broker'
has_started = False
def ready(self):
if not os.environ.get("RUN_MAIN"):
# Avoid running for reloader
return
if BrokerConfig.has_started:
return
BrokerConfig.has_started = True
proc = Process(target=infinite_loop, daemon=True)
proc.start()

因此,最终我选择了一个守护进程,并且我想要的清理被放入启动进程的范围(作为SIGTERM处理程序(。

相关内容

  • 没有找到相关文章

最新更新