繁体   English   中英

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

[英]Celery executes a task after calling task.delay() for 3-5 times

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

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

  • 你如何开始你的工人(即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中的celery日志,并列出这样的队列(以bash作为root):

rabbitmqctl list_queues -p your_vhost

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM