【问题标题】:Celery worker receiving task even I have no message on RabbitMQ queue即使我在 RabbitMQ 队列上没有消息,芹菜工人也会收到任务
【发布时间】:2018-05-04 19:41:35
【问题描述】:

场景:

我在 celery 上创建了一个 shared_task 用于测试目的 [RabbitMQ 作为消息队列的代理]:

@app.task(bind=True, max_retries = 5, base=MyTask)
def testing(self):
    try:
        raise smtplib.SMTPException

    except smtplib.SMTPException as exc:
        print 'This is it'
        self.retry(exc=exc, countdown=2)


#Overriding base class of Task
class MyTask(celery.Task):
    def on_failure(self, exc, task_id, args, kwargs, einfo):
        print "MyTask on failure world"
        pass

在创建一个worker后,我通过输入命令testing.delay() 10次调用了测试任务。我只是通过按 Ctrl+C 退出服务器并从 RabbitMQ 服务器中删除所有这些队列。我再次启动了服务器。

服务器启动命令: celery worker --app=my_app.settings -l DEBUG

删除队列命令: rabbitmqadmin delete queue name=<queue_name>

删除工人命令: ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9

问题:

由于我已经从 RabbitMQ 服务器中删除了所有队列,现在应该只接收新任务。但是我仍然收到旧任务,而且列表上没有出现新任务。造成这种情况的真正原因是什么?

【问题讨论】:

    标签: python rabbitmq celery django-celery


    【解决方案1】:

    发生的情况是您的工作人员执行了多个任务,除非您在启动工作人员时有 -Ofair 标志

    https://medium.com/@taylorhughes/three-quick-tips-from-two-years-with-celery-c05ff9d7f9eb

    因此,即使您清除了队列,您的工作进程仍将继续运行已完成的任务,除非您终止工作进程本身。

    编辑添加

    如果重启后有任务在运行,则需要撤销该任务。

    http://celery.readthedocs.io/en/latest/faq.html#can-i-cancel-the-execution-of-a-task

    【讨论】:

    • 即使在通过键入:ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9 并在重新启动计算机后从命令中杀死 celery 工人之后,我仍会收到这些任务。我从哪里得到这些消息?
    • 因为您还没有撤销任务。 celery.readthedocs.io/en/latest/…
    • 执行上述任务时没有调用 revoke 方法。现在,我怎样才能清除那些任务列表?我可以看到那些剩余任务的 task_id 吗?
    • 使用芹菜工人检查,特别活跃docs.celeryproject.org/en/latest/userguide/…
    猜你喜欢
    • 2015-10-19
    • 2019-08-01
    • 1970-01-01
    • 2019-04-07
    • 2017-05-10
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2016-09-12
    相关资源
    最近更新 更多