python celery 多work多隊列

來源:互聯網
上載者:User

標籤:default   redis   ret   key   stat   forms   port   協議   alt   

1.Celery模組調用

既然celery是一個分布式的任務調度模組,那麼celery是如何和分布式掛鈎呢,celery可以支援多台不通的電腦執行不同的任務或者相同的任務。

如果要說celery的分布式應用的話,就要提到celery的訊息路由機制,AMQP協議。具體的可以查看AMQP的文檔。簡單地說就是可以有多個訊息佇列(Message Queue),不同的訊息可以指定發送給不同的Message Queue,而這是通過Exchange來實現的。發送訊息到Message Queue中時,可以指定routiing_key,Exchange通過routing_key來把訊息路由(routes)到不同的Message Queue中去。

多worker,多隊列,執行個體:

1.在伺服器上編寫檔案tasks.py。首先定義一個Celery的對象,然後通過celeryconfig.py對celery對象進行設定。之後又分別定義了三個task,分別是taskA, taskB和add。

 

#!/usr/bin/env#-*-conding:utf-8-*-from celery import Celery,platformsplatforms.C_FORCE_ROOT = Trueapp = Celery()app.config_from_object("celeryconfig")@app.taskdef tashA(x,y):return x*y@app.taskdef taskB(x,y,z):return x+y+z@app.taskdef add(x,y):return x+y

2.編寫celeryconfig.py檔案。

 

#!/usr/bin/env python#-*- coding:utf-8 -*-from kombu import Exchange,Queuefrom celery import platformsplatforms.C_FORCE_ROOT = TrueBROKER_URL = "redis://localhost:6379/7" CELERY_RESULT_BACKEND = "redis://localhost:6379/8"CELERY_QUEUES = (Queue("default",Exchange("default"),routing_key="default"),Queue("for_task_A",Exchange("for_task_A"),routing_key="for_task_A"),Queue("for_task_B",Exchange("for_task_B"),routing_key="for_task_B") )CELERY_ROUTES = {‘tasks.taskA‘:{"queue":"for_task_A","routing_key":"for_task_A"},‘tasks.taskB‘:{"queue":"for_task_B","routing_key":"for_task_B"}}

3.啟動worker來指定task

celery -A tasks worker -l info -n workerA.%h -Q for_task_A

celery -A tasks worker -l info -n workerB.%h -Q for_task_B

4.傳入參數

將上面兩個檔案匯出到pycharm中:

 

編寫檔案傳參:

 

from tasks import *re1 = taskA.delay(100, 200)re2 = taskB.delay(1,2, 3)print(re3.status)          #查看re3的狀態print(re3.id)               #查看re3的id

運行之後可見:taskA,taskB都已正常執行。

5.我們可以看到add(re3)的狀態是PENDING,表示沒有執行,這個是因為沒有celeryconfig.py檔案中指定改route到哪一個Queue中,所以會被發動到預設的名字celery的Queue中,但是我們還沒有啟動worker執行celery中的任務。下面,我們來啟動一個worker來執行celery隊列中的任務。

celery -A tasks worker -l info -n worker.%h -Q celery 

這樣我們再次運行pycharm就可以看見add也被運行了,並且redis資料庫中也有該id了。

2.Celery與定時任務

1.在celery中執行定時任務非常簡單,只需要設定celery對象中的CELERYBEAT_SCHEDULE屬性即可。
下面我們接著在celeryconfig.py中添加CELERYBEAT_SCHEDULE變數:

 

CELERY_TIMEZONE = ‘UTC‘CELERYBEAT_SCHEDULE = {    ‘taskA_schedule‘ : {        ‘task‘:‘tasks.taskA‘,        ‘schedule‘:20,        ‘args‘:(5,6)    },    ‘taskB_scheduler‘ : {        ‘task‘:"tasks.taskB",        "schedule":200,        "args":(10,20,30)    },    ‘add_schedule‘: {        "task":"tasks.add",        "schedule":10,        "args":(1,2)    }}

2.Celery啟動定時任務

celery -A tasks worker -l info -n workerA.%h -Q for_task_A -B

 

啟動完成後:

taskA每20秒執行一次taskA.delay(5, 6)

taskB每200秒執行一次taskB.delay(10, 20, 30)

Celery每10秒執行一次add.delay(1, 2)

python celery 多work多隊列

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.