Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Celery 如何防止多个工作人员运行只发送一次的任务?_Celery_Celery 3 - Fatal编程技术网

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

Celery 如何防止多个工作人员运行只发送一次的任务?,celery,celery-3,Celery,Celery 3,最近我注意到一种奇怪的芹菜(3.1.25)行为。使用send_task()将任务排队执行一次,但是过了一会儿,我看到多个任务正在运行同一个任务!我花了几个小时查看芹菜文档,试图找出如何防止这种行为。任何帮助都将不胜感激 以下是检查激活的: ... -> celery1@ec2-256-234-55-209.compute-1.amazonaws.com: OK * {'hostname': 'celery1@ec2-256-234-55-209.compute-1.amazonaw

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

以下是
检查激活的

...
-> 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作为所有默认的代理(没有花哨的交易所和路线)。

这种行为可能有几个原因

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

无论如何,你可以通过使用。其主要思想是在任务中检查任务是否已被提升和执行。是的,这看起来像是一个解决办法,但效果很好。

您的员工能看到彼此吗?是的,他们都连接到一个Redis代理……是否有ETA/倒计时参数?请参见此处的“可见性超时”信息:另外,您是否设置了任何自定义路由选项?使用消息路由,您可以设置广播队列(因此任务将发送给所有工作人员)和许多其他模式,如果您手动设置路由,也很容易意外地执行此操作。不,我使用exchange/路由的默认设置。这些节点都订阅了默认队列(芹菜)。回答第一个问题-不,它没有任何预计到达时间/倒计时。事实上,任务是在没有任何额外参数的情况下配置的。几天前,我还在这里问了另一个有点相关的奇怪问题:请注意,任务是由一个send_task()调用触发的,而不是由celerybeat触发的…谢谢你的celery_一次,我一定会尝试一下。尽管这不能回答我的问题,但我还是会奖励它,因为至少你试过帮助我。:)@谢谢你。我想知道你的任务是否仍然开始多次,即使只吃过一次芹菜?