Celery调用task.delay()3-5次后执行任务

时间:2018-12-27 01:59:42

标签: django rabbitmq celery djcelery

我在Django项目中使用芹菜。我试过使用rabbitmq和redis后端,但都无法正常工作。使用的celery版本是3.1.26.post2。我必须调用2、3有时是5次task.delay()才能看到任务正在运行。有时通常在频繁调用同一任务后,其“执行率”会提高并在70-80%的时间内执行该任务。例如,它删除5个task.delay()调用中的1个或2个,但是执行3-4个。你有没有遇到过这样的事情?可能是什么原因?

1 个答案:

答案 0 :(得分:0)

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

  • 您如何开始工作(即celery worker -A your_package_name
  • 确定要订阅同一经纪人,以后再使用rabbitmqctl
  • 检查

根据您的反馈,我认为您的任务要么花费很长时间才能完成,要么以某种奇怪的方式挂起并且永远无法完成。它们肯定落在芹菜工人启动时创建的默认队列中(称为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中的芹菜日志,并列出这样的队列(以bash为根):

rabbitmqctl list_queues -p your_vhost

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