【问题标题】:Celery executes a task after calling task.delay() for 3-5 timesCelery 在调用 task.delay() 3-5 次后执行一个任务
【发布时间】:2019-05-25 02:58:29
【问题描述】:

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

【问题讨论】:

  • 我曾经打算在一个 Django 项目中使用 Celery 和 RabbitMQ。然后我清醒过来了。相反,我编写了一个使用 Threads 并从 cron 运行的自定义管理命令。对于“消息传递”,我使用了 Django 模型。
  • 但由于目前的情况,我必须使用芹菜。
  • 当您调用此任务时,rabbitmqctl list_queues -p your_vhost_name 会说什么? (以root身份运行)
  • rabbitmqctl list_queues 显示类似 Listing queues ... 13936400801f4fbf863ac1065d172041 1 1e12015a2dfe4c3cae3da0106de45de3 1 celery 361 celery@Debian-84-jessie-64-minimal.celery.pidbox 0 celeryev.195a0af6-3058-4e14-bfbd-79d013fead8b 0 celeryev.2a18f5f9-c83e-4c6e-958e-2970d67ab9f0 0 celeryev.39795174-31bb-43d0-a83f-d43615feca08 0 e8be18ad864048ed82909ba711ee22be 0 eeca2b77716846d089806204115c4adb 1 topaz 0 topaz-worker@Debian-84-jessie-64-minimal.celery.pidbox 0 w1@Debian-84-jessie-64-minimal.celery.pidbox 0 w2@Debian-84-jessie-64-minimal.celery.pidbox 0 ...done.
  • 但是当我添加主机名时,它显示“列出队列,...完成”。我还注意到,每次调用任务时,芹菜的价值都会增加。

标签: django rabbitmq celery djcelery


【解决方案1】:

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

  • 你如何开始你的工人(即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"

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

rabbitmqctl list_queues -p your_vhost

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

【讨论】:

    猜你喜欢
    • 2012-08-13
    • 2012-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 2019-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多