【发布时间】:2019-10-07 11:11:00
【问题描述】:
我必须设置一个工作人员在某个事件发生后处理一些数据。我知道我可以使用python manage.py runworker my_worker 启动工作程序,但我需要在与主 Django 应用程序相同的进程中在单独的线程上启动工作程序。
为什么我需要在单独的线程中而不是在单独的进程中?因为工人将执行一项相当轻量级的工作,不会使服务器资源过载,而且,为生产中的新进程进行设置的努力不值得性能提升。换句话说,如果可能的话,我更愿意将它保留在 Django 的进程中。
为什么不同步执行工作?因为它是一个单独的逻辑,需要扩展的可能性,并且它超出了主要的 HTTP 请求-回复范围。这是一个不干扰主逻辑的后处理任务。我需要从基础设施的角度来解耦这项任务,而不仅仅是逻辑上的(例如使用普通信号)。
Django Channels 是否提供了以这种方式运行工作者的可能性? 在单独的线程上手动启动工作器会有什么缺点吗?
现在我已经设置了消息代理消费者线程(不使用 Channels),因此我有了启动新工作线程的入口点。但正如我从 Channel 的 runworker 命令中看到的那样,它会加载整个应用程序,因此看起来幼稚的 worker.run() 调用并不是正确的方法(我可能对这个有误)。
【问题讨论】:
标签: python django multithreading django-channels