芹菜工人接收任务,即使我在RabbitMQ队列上没有消息

时间:2017-11-21 11:01:40

标签: python rabbitmq celery django-celery

情境:

我在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

我通过在创建工作人员后输入命令 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服务器中删除了所有队列,现在只应接收新任务。但是我仍然在完成旧任务,此外,列表中没有新任务出现。这是什么原因?

1 个答案:

答案 0 :(得分:0)

发生的事情是你的工作人员接受了多个任务,除非你在启动工作时有-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