【问题标题】:Django app custom clean up for code reloadDjango 应用程序自定义清理以重新加载代码
【发布时间】:2020-12-20 16:27:50
【问题描述】:

我的 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


    【解决方案1】:

    我设法以相反的方式做到了这一点,因此我没有监听或挂钩某些 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 处理程序)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-17
      • 1970-01-01
      • 1970-01-01
      • 2016-06-07
      • 2013-04-27
      • 2011-06-19
      • 2012-04-21
      相关资源
      最近更新 更多