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



我在django项目中使用了芹菜。我已经尝试过使用rabbitmq和redis后端,但两者都不起作用。二手芹菜版本为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)。

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

我通常会这样定义我的任务(在我定义任务应该做什么的包中,这段代码将由芹菜工人执行):

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,那么在尝试使用代理(在下面的bash中作为root运行)之前,你需要创建vhost、用户和密码

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

希望这能帮助你走上正轨。

相关内容

  • 没有找到相关文章

最新更新