如何防止多个工作人员仅运行一次发送的任务?

时间:2016-12-13 10:39:55

标签: celery celery-3

最近我注意到一种奇怪的芹菜(3.1.25)行为。一个任务排队等待仅使用send_task() 执行一次,但是过了一段时间我看到多个运行相同的任务!我花了几个小时查看Celery文档,试图找出如何防止这种行为。任何帮助将不胜感激!

以下是inspect active

...
-> celery1@ec2-256-234-55-209.compute-1.amazonaws.com: OK
    * {'hostname': 'celery1@ec2-256-234-55-209.compute-1.amazonaws.com', 'id': '5bf971b7-c2d2-47a1-9e3e-abec6c3c7ab4', 'args': "['myex', 'equities', 20170103]", 'time_start': 1633747.663716712, 'name': 'parsing.2pass', 'acknowledged': False, 'delivery_info': {'exchange': 'celery', 'priority': 0, 'redelivered': None, 'routing_key': 'celery'}, 'worker_pid': 28649, 'kwargs': '{}'}
    * {'hostname': 'celery1@ec2-256-234-55-209.compute-1.amazonaws.com', 'id': '5bf971b7-c2d2-47a1-9e3e-abec6c3c7ab4', 'args': "['myex', 'equities', 20170103]", 'time_start': 1637348.143546186, 'name': 'parsing.2pass', 'acknowledged': False, 'delivery_info': {'exchange': 'celery', 'priority': 0, 'redelivered': None, 'routing_key': 'celery'}, 'worker_pid': 1550, 'kwargs': '{}'}
-> celery1@ec2-54-234-55-254.compute-1.amazonaws.com: OK
    * {'hostname': 'celery1@ec2-256-234-55-254.compute-1.amazonaws.com', 'id': '5bf971b7-c2d2-47a1-9e3e-abec6c3c7ab4', 'args': "['myex', 'equities', 20170103]", 'time_start': 1626395.204211438, 'name': 'parsing.2pass', 'acknowledged': False, 'delivery_info': {'exchange': 'celery', 'priority': 0, 'redelivered': None, 'routing_key': 'celery'}, 'worker_pid': 26978, 'kwargs': '{}'}
-> celery1@ec2-54-226-20-88.compute-1.amazonaws.com: OK
    * {'hostname': 'celery1@ec2-256-226-20-88.compute-1.amazonaws.com', 'id': '5bf971b7-c2d2-47a1-9e3e-abec6c3c7ab4', 'args': "['myex', 'equities', 20170103]", 'time_start': 1630146.08942695, 'name': 'parsing.2pass', 'acknowledged': False, 'delivery_info': {'exchange': 'celery', 'priority': 0, 'redelivered': None, 'routing_key': 'celery'}, 'worker_pid': 19473, 'kwargs': '{}'}
...

请注意,任务5bf971b7-c2d2-47a1-9e3e-abec6c3c7ab4正在至少3个工作程序上运行,即使它是由单个 send_task()调用触发的。我们使用Redis作为所有默认值的经纪人(没有花哨的交易所和路线)。

1 个答案:

答案 0 :(得分:1)

这种行为可能有几种可能的原因。

  • 也许你用celerybeat服务开始芹菜。在这种情况下,应该只有一个芹菜过程。在其他情况下,每个流程都会安排相同的任务。
  • 也许你应该调整你的队列。由于redis使用广播消息来传递任务。 More info here即使您没有使用ETA /倒计时,这也可能是重复的原因

无论如何,您可以使用celery_once来阻止这一点。主要思想是在任务中检查它是否已被提升和执行。是的,这看起来像是一种解决方法,但它的效果非常好。