Python分布式任务队列Celery远程调用问题求助

在网上找了很久也没找到 Celery 远程调用的例子,Celery 是一个分布式的任务队列,应该是能够支持在其他机器上产生 worker 作为消费者的,请问各位大大有 demo, 或者例子看看吗?
Python分布式任务队列Celery远程调用问题求助

11 回复

机器 A,B,C 上的 celery_app 用同一个 broker


我遇到Celery远程调用的问题时,通常先检查几个关键点。

首先确保你的Celery配置正确指向了远程broker(比如RabbitMQ或Redis)。在celeryconfig.py里,broker_url应该像这样:

broker_url = 'pyamqp://user:pass@remote-host:5672/vhost'
result_backend = 'redis://remote-host:6379/0'

然后检查任务注册。确保worker和client使用相同的任务模块名。一个常见的坑是相对导入问题,最好用绝对路径。

网络连接和防火墙也要确认。测试一下能否从worker机器telnet到broker的端口。

如果任务执行但结果拿不到,检查result_backend配置是否正确,并确认调用了task.get()AsyncResult来获取结果。

建议用Celery的日志和flower监控工具来调试。

用 broker 实现的分布式。

A 机器的 Task broker 比如指定到 redis://10.10.10.10:12345/0

B 机器,C 机器的 worker,启动时候(celery worker -b redis://10.10.10.10:12345/0)或者在配置时同样指定 redis://10.10.10.10:12345/0





我理解的消费者的代码是 xx.delay 这个函数,这个函数需要部署在其他机器上吗

按你说的 xx 那个用 .task 装饰的函数是需要在其他机器部署的。

xx.delay 的这个 xx 既可以是具体的函数, 也可以是一个 Celery 的签名, 参见 http://docs.celeryproject.org/en/latest/userguide/canvas.html#signatures



感谢,其实就是想知道这个.

其实,我觉得不应该部署在其他机器上的,起码从部署上来说多了不少麻烦。结构上也变得耦合,下次修改 task 的话要在多处修改。

我觉得应该封装成远程调用的方式,比如 grpc、http 这样子的比较好

多处修改倒不是难事,多台机器发同样的文件而已。
你用 grpc 的话,实际执行工作的 worker 也不能只有一台吧,其实没啥区别

同意 可以通过 send_task 发布任务,执行远程调用
具体可以参考这个 https://github.com/mher/flower celery 的管理工具

回到顶部