在同一进程中启动 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),所以我有启动新工作线程的入口点。但正如我从 Channel 的 runworker
命令中看到的那样,它加载了整个应用程序,所以它看起来不像是天真的 worker.run()
调用正确的方法(我可能对这个有误)。
我找到了问题的答案。
答案是否,你不能只在同一个进程中启动一个worker。这是因为消费者需要 运行 在一个事件循环线程中,并且在同一进程中拥有多个事件循环线程一点也不好(Django WSGI 应用程序已经 运行 是主线程带有事件循环)。
您最好的办法是在单独的进程中启动工作程序。正如我在问题中提到的,我在一个单独的线程上启动了一个消息代理消费者,这也不是一个好方法,所以我更改了我的配置以将消费者作为单独的进程启动。
我必须设置一个 worker 来处理特定事件发生后的一些数据。我知道我可以用 python manage.py runworker my_worker
启动工作程序,但我需要的是在与主 Django 应用程序相同的进程中在单独的线程上启动工作程序。
为什么我需要在单独的线程中而不是在单独的进程中?因为 worker 会执行一个相当轻量级的工作,不会使服务器的资源超载,而且,在生产中为新进程进行设置的努力不值得获得性能。换句话说,如果可能的话,我更愿意将它保留在 Django 的进程中。
为什么不同步执行作业?因为它是一个单独的逻辑,需要扩展的可能性,并且它超出了主要的 HTTP 请求-回复范围。这是一个 post-processing 任务,不会干扰主要逻辑。我需要将此任务从基础设施的角度分离出来,而不仅仅是逻辑的(例如,使用普通信号)。
Django Channels 是否有可能以这种方式向 运行 工人提供? 在单独的线程上手动启动 worker 会有什么缺点吗?
现在我已经设置了消息代理消费者线程(不使用 Channels),所以我有启动新工作线程的入口点。但正如我从 Channel 的 runworker
命令中看到的那样,它加载了整个应用程序,所以它看起来不像是天真的 worker.run()
调用正确的方法(我可能对这个有误)。
我找到了问题的答案。
答案是否,你不能只在同一个进程中启动一个worker。这是因为消费者需要 运行 在一个事件循环线程中,并且在同一进程中拥有多个事件循环线程一点也不好(Django WSGI 应用程序已经 运行 是主线程带有事件循环)。
您最好的办法是在单独的进程中启动工作程序。正如我在问题中提到的,我在一个单独的线程上启动了一个消息代理消费者,这也不是一个好方法,所以我更改了我的配置以将消费者作为单独的进程启动。