【问题标题】:Processor Intensive Task For Django CeleryDjango Celery 的处理器密集型任务
【发布时间】:2012-10-29 07:52:21
【问题描述】:
假设,仅作为示例,我有一个用于处理视频的 Django Web 应用程序,我想使用 celery 来卸载其中的一些任务。如果我在 Celery 中有一个任务,例如视频编辑,那是处理器密集型的,我不想在运行 Django 的同一台服务器上运行它。有没有办法将您在 Django 应用程序中定义的任务发送到另一台服务器上远程运行?
我刚刚阅读了有关 Celery 的所有文档,但没有看到这种情况。似乎适合这种情况的唯一方法是在其他地方运行 Celery 并使用 Celery HTTP 网关向它发出 HTTP 请求。
对于 django-celery,任务在哪里执行?您在哪里设置代理 URL 或在运行 django 的机器上?
【问题讨论】:
标签:
django
celery
django-celery
【解决方案1】:
Celery 开箱即用地执行远程任务。假设你有一个 python 模块,其中有一个 celery worker 来处理你的视频,称为 videoprocessor.py。你把它放在你的远程计算机上并在那里启动那个工人:
celery -A videoprocessor worker
(如果你想从命令行运行它)
您也将该模块放置在网络服务器机器上,但您确实不在那里启动它。然而,它位于这样一个位置,它可以由您的 Web 服务器计算机上的主脚本导入,该脚本称为 client.py 以进行论证。此外,它以与远程计算机上完全相同的名称导入,例如以“MyPackage.videoprocessor”开头。
现在,当 Web 服务器上的主脚本 client.py 导入您的 videoprocessor.py 模块时,它会从该模块中的工作程序中创建一个 签名。此签名对远程计算机上的 videoprocessor.py 也有效。而且由于那个正在运行,而服务器机器上的 videoprocessor.py 没有运行,所以每次都会使用远程工作人员。
确保远程机器上的工作人员使用与 Web 服务器机器上的客户端脚本相同的后端。这可能是 Redis 或 RabbitMQ 或其他东西,您至少需要指定 IP 号,可能更多(数据库、端口),具体取决于您的设置。