簡體   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