【问题标题】:Start a Django Channels Worker within the same process在同一进程中启动 Django Channels Worker
【发布时间】:2019-10-07 11:11:00
【问题描述】:

我必须设置一个工作人员在某个事件发生后处理一些数据。我知道我可以使用python manage.py runworker my_worker 启动工作程序,但我需要在与主 Django 应用程序相同的进程中在单独的线程上启动工作程序。

为什么我需要在单独的线程中而不是在单独的进程中?因为工人将执行一项相当轻量级的工作,不会使服务器资源过载,而且,为生产中的新进程进行设置的努力不值得性能提升。换句话说,如果可能的话,我更愿意将它保留在 Django 的进程中。

为什么不同步执行工作?因为它是一个单独的逻辑,需要扩展的可能性,并且它超出了主要的 HTTP 请求-回复范围。这是一个不干扰主逻辑的后处理任务。我需要从基础设施的角度来解耦这项任务,而不仅仅是逻辑上的(例如使用普通信号)。

Django Channels 是否提供了以这种方式运行工作者的可能性? 在单独的线程上手动启动工作器会有什么缺点吗?

现在我已经设置了消息代理消费者线程(不使用 Channels),因此我有了启动新工作线程的入口点。但正如我从 Channelrunworker 命令中看到的那样,它会加载整个应用程序,因此看起来幼稚的 worker.run() 调用并不是正确的方法(我可能对这个有误)。

【问题讨论】:

    标签: python django multithreading django-channels


    【解决方案1】:

    我找到了问题的答案。

    答案是,你不能只在同一个进程中启动一个worker。这是因为消费者需要在一个事件循环线程中运行,而在同一个进程中拥有多个事件循环线程是不好的(Django WSGI 应用程序已经运行带有事件循环的主线程)。

    您能做的最好的事情是在一个单独的进程中启动工作程序。正如我在问题中提到的,我在单独的线程上启动了消息代理使用者,这也不是一个好方法,因此我更改了配置以将使用者作为单独的进程启动。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-03
      • 2017-05-14
      • 1970-01-01
      • 2011-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-07
      相关资源
      最近更新 更多