首页 > 解决方案 > Celery 在调用 task.delay() 3-5 次后执行一个任务

问题描述

我在 django 项目中使用芹菜。我曾尝试使用 rabbitmq 和 redis 后端,但都不起作用。使用的 celery 版本是 3.1.26.post2。我必须调用 2、3 有时 5 次 task.delay() 才能看到任务正在运行。有时通常在频繁调用同一个任务后,它的“执行率”会增加,并在 70-80% 的时间内执行任务。例如,它丢弃 5 个 task.delay() 调用中的 1 个或 2 个,但执行其中的 3-4 个。你有过这样的经历吗?可能是什么原因?

标签: djangorabbitmqcelerydjcelery

解决方案


好的,根据您的描述,有一些我不知道(它们会有所帮助):

  • 你如何开始你的工人(即celery worker -A your_package_name
  • 你确定你订阅了你以后检查的同一个经纪人吗rabbitmqctl

根据您的反馈,我猜您的任务要么需要很长时间才能完成,要么以某种奇怪的方式挂起并且永远无法完成。它们肯定会落在 celery worker 在启动时创建的默认队列中(称为celery)。

发布您尝试插入队列的示例任务的代码以及如何尝试将其插入队列的代码示例也会有所帮助。

我通常会这样定义我的任务(在我定义任务应该执行的包中,此代码将由 celery worker 执行):

from your_package_name.celery import app
@app.task
my_task_name(my_param):
    #do something here!
    return True

我会像这样将我的任务插入队列(即从 python shell 或从我应该将任务插入队列的其他包):

my_task_name.apply_async(
    args=(my_param,),
    queue='my_queue_name',)

在某处your_package_name有一些代码可以定义您的代理(在我的情况下,我保留它,celeryconfig.py但这取决于您)

BROKER_URL = 'amqp://your_user_name:very_secret_pwd@localhost:5672/your_vhost'

不要将 vhost 与您的主机名混淆。

如果像我一样使用rabbitmq,那么您需要在尝试使用代理之前创建虚拟主机、用户和密码(以root身份在下面的bash中运行)

sudo -u rabbitmq -n rabbitmqctl add_user your_user_name very_secret_pwd
sudo -u rabbitmq -n rabbitmqctl add_vhost your_vhost
sudo -u rabbitmq -n rabbitmqctl set_user_tags your_user_name your_example_tag
sudo -u rabbitmq -n rabbitmqctl set_permissions -p your_vhost your_user_name ".*" ".*" ".*"

我会这样开始我的工人:

python -m celery worker -A your_package_name -Q my_queue_name -c 1 -f /tmp/celery.log --loglevel="INFO"

然后我会查看其中的 celery 日志,/tmp/celery.log并像这样列出我的队列(在 bash 中以 root 身份):

rabbitmqctl list_queues -p your_vhost

希望这将帮助您走上正确的轨道。


推荐阅读