在同一进程中启动 Django Channels Worker

Start a Django Channels Worker within the same process

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

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

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

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

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

我找到了问题的答案。

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

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