一篇還不錯的入門說明:
官方文件:
這裡不多說重複內容,只講一下結構上的理解:
celery不僅是佇列,它是乙個並行分布式框架。
你不需要考慮怎麼分布式,怎麼寫daemon程序,只需要關注你的單個任務要怎麼處理。當你把單個任務處理的**放入celery框架之後,它就自帶了並行、分布式、後台持續執行的特點。
celery使用redis,rabbitmq等作為broker,它的兩個角色:任務傳送方(生產者)把任務放入佇列,worker(消費者)從佇列中取出任務進行處理。這兩個角色並不要求在同一臺機器上,且可以有多台機器上的多個生產者,也可以有多台機器上的多個worker。
celery的生產者和消費者怎麼知道該使用哪個函式執行任務呢?這其實是使用了反射機制,以官方文件getting started例子來說,即:
當生產者使用
from my_tasks import add
ret = add.delay(3, 4)
把這個任務放入佇列的時候,同時放入了my_tasks.add
這個函式名,消費者取出任務的同時會取出這個my_tasks.add
並呼叫自己的已經匯入的這個函式進行處理。
所以在生產者、消費者的匯入上需要注意,否則消費者會報找不到函式的。
(注意:在資料夾folder
中使用from .my_tasks import add
匯入的add將會被當成folder.my_tasks.add
!!)
python系列之反射、物件導向生產者和消費者都需要匯入乙個定義了任務的同名檔案(如:my_tasks.py),注意是同名檔案,而不必是同一檔案。(當生產者和消費者不在同一臺機器上,自然無法是同一檔案...)
消費者所匯入的my_tasks檔案中,當然需要包含詳細的處理過程,但是生產者所匯入的my_tasks檔案,作用卻和c/c++中的標頭檔案差不多。
重新構造asyncresult物件
上面呼叫ret = add.delay(3, 4)
時,返回的 ret 是乙個asyncresult物件,可以使用 ret.ready() 檢視任務是否執行完畢,使用ret.get(timeout=xx)獲取執行結果。(需要配置backend)
當任務很多的時候,我是不是可以把這些任務的id寫入文字檔案或者資料庫,等過一段時間再來查詢某個任務的狀態呢?
當然可以,ret這個asyncresult物件可以使用ret.id這個字串重新構造:
ret
ret.id
'b733c852-4161-449e-930a-a395702b1203'
# 構造:
import tasks # 為了匯入backend配置,不必重複匯入
from celery.result import asyncresult
r=asyncresult('b733c852-4161-449e-930a-a395702b1203')
rr.ready()
true # 任務已執行完畢
r.get(timeout=3)
。。。。
python3.7安裝celery,執行時可能報錯:
file "/users/li/.venv/venv-myprojet/lib/python3.7/site-packages/celery/backends/redis.py", line 22
from . import async, base
^syntaxerror: invalid syntax
原因是python3.7的async重新命名了
[rename `async` to `asynchronous` (async is a reserved keyword in python 3.7) #4879](
開發人員已經處理了這個issue,合併了master,快速的解決方案是通過github安裝celery,命令如下:
pip install --upgrade
在celery中使用logging記錄日誌
由於專案需要日誌檔案的功能,又由於專案中有用到celery模組,所以就看了看celery的用法,然後研究了一下如何在celery中記錄日誌。如圖 這是我的專案的目錄,proj是專案名,celery.py檔案是celery的一些基本配置,比如你要使用的中介軟體是什麼,用的是哪台電腦的中介軟體。比如我是...
celery的使用介紹
celery是專注實時處理和任務排程的分布式任務佇列。主要應用場景 1,web應用,當需要觸發事件需要較長時間處理完成,可以交給celery進行非同步執行,執行完後返回結果,這段時間不用等待,提高系統的吞吐量和響應時間。2,完成任務時,需要額外的事件處理,如傳送郵件等。3,後台定時任務處理,cele...
Celery的基本使用
celery是乙個簡單 靈活且可靠的,處理大量訊息的分布式系統 專注於實時處理的非同步任務佇列 同時也支援任務排程 celery 官網 celery 官方文件英文版 celery 官方文件中文版 ps celery在windows系統上會出現不相容的情況1.可以不依賴任何伺服器,通過自身命令,啟動服...