celery使用的小記錄

2022-06-29 23:33:09 字數 2333 閱讀 1517

一篇還不錯的入門說明:

官方文件:

這裡不多說重複內容,只講一下結構上的理解:

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.可以不依賴任何伺服器,通過自身命令,啟動服...