celery使用筆記

2021-08-08 20:32:59 字數 3238 閱讀 1040

非同步任務神器 celery 簡明筆記 兩篇文章同名但類容不一樣)

分布式佇列神器 celery

windows安裝並使用celery

django 使用 celery 實現非同步任務

基於django與celery實現非同步佇列任務

redis核心概念

celery與rabbitmq、redis

使用celery踩過的坑 其中提到了重複執行任務的問題和解決辦法)

在程式的執行過程中,我們經常會碰到一些耗時耗資源的操作,為了避免它們阻塞主程式的執行,我們經常會採用多執行緒或非同步任務。比如,在 web 開發中,對新使用者的註冊,我們通常會給他發一封啟用郵件,而發郵件是個 io 阻塞式任務,如果直接把它放到應用當中,就需要等郵件發出去之後才能進行下一步操作,此時使用者只能等待再等待。更好的方式是在業務邏輯中觸發乙個發郵件的非同步任務,而主程式可以繼續往下執行。

celery 是乙個強大的分布式任務佇列,它可以讓任務的執行完全脫離主程式,甚至可以被分配到其他主機上執行。我們通常使用它來實現非同步任務(async task)和定時任務(crontab)。它的架構組成如下圖:

可以看到,celery 主要包含以下幾個模組:

在客戶端和消費者之間傳輸資料需要序列化和反序列化,celery支援如表9.2所示的序列化方案:

使用 celery 實現非同步任務主要包含三個步驟:

為了簡單起見,對於 broker 和 backend,這裡都使用 redis。在執行下面的例子之前,請確保 redis 已正確安裝,並開啟 redis 服務。然後需要安裝redis的python客戶端:

pip install redis
pip install celery
坑1:unable to run tasks under windows #4081

筆者安裝的是最新的celery4.1,但是在windows環境中,celery 可以正常連線,但不能正常執行任務。(參考網上解決辦法:1、

2、celery 4.0不支援windows系統:oserror: [winerror 87] 引數錯誤)

解決辦法:採用較低的版本

try to uninstall celery 4.1

.0and

replace

to3.1

.24pip uninstall celery

pip install celery==3.1

.24

將下面的**儲存為檔案 tasks.py:

# -*- coding: utf-8 -*-

import time

from celery import celery

broker = 'redis:'

backend = 'redis:/0'

defadd

(x, y):

time.sleep(5) # 模擬耗時操作

return x + y

上面的**做了幾件事:

指定訊息中介軟體用 redis,url 為 redis:;

指定儲存用 redis,url 為 redis:/0;

在當前目錄,使用如下方式啟動 celery worker:

celery worker -a tasks --loglevel=info
其中:

引數 –loglevel 指定了日誌級別,預設為 warning,也可以使用 -l info 來表示;

在生產環境中,我們通常會使用 supervisor 來控制 celery worker 程序。

啟動成功後,控制台會顯示如下輸出:

顯示「celery@***xx ready「即表示celery worker啟動成功了。

開啟notebook(或者在當前目錄開啟 python 控制台),輸入以下**:

from tasks import add

add.delay(2, 8)

在上面,我們從 tasks.py 檔案中匯入了 add 任務物件,然後使用 delay() 方法將任務傳送到訊息中介軟體(broker),celery worker 程序監控到該任務後,就會進行執行。

執行這段**,我們看到結果為:

我們將視窗切換到 worker 的啟動視窗,會看到多了兩條日誌,如下圖所示,可見add函式的計算結果為10:

這說明任務已經被排程並執行成功。

另外,我們如果想獲取執行後的結果,可以這樣做:

>>> result = add.delay(2, 6)

>>> result.ready() # 使用 ready() 判斷任務是否執行完畢

false

>>> result.ready()

false

>>> result.ready()

true

>>> result.get() # 使用 get() 獲取任務結果

8

在上面,我們是在 python 的環境中呼叫任務。事實上,我們通常在應用程式中呼叫任務。比如,將下面的**儲存為 client.py:

# -*- coding: utf-8 -*-

from tasks import add

# 非同步任務

add.delay(2, 8)

print

'hello world'

執行命令 $ python client.py,可以看到,雖然任務函式 add 需要等待 5 秒才返回執行結果,但由於它是乙個非同步任務,不會阻塞當前的主程式,因此主程式會往下執行 print 語句,列印出結果。

Vim 使用筆記

set hlsearch set nohlsearch 搜尋後清除上次的加亮 nohl nohlsearch 拷貝 很有用的一句話,規定了格式選項,讓它換行不自動空格 set formatoptions tcrqn set fo r set noautoindent 再 shift insert 正...

xemacs使用筆記

xemacs使用筆記 xemacs emacs的下一代,由lucid原創 from debian參考手冊.由於不知道什麼時候刪掉了emacs的乙個重要檔案.每次都沒法安裝好.突然發現了xemacs,於是決定使用看看.本人還是菜鳥,僅供交流 我使用的ubuntu系統,所以就直接apt get inst...

TreeView使用筆記

treeview由節點構成,建樹通過對treeview.items屬性進行操作。items是乙個ttreenodes物件,這是乙個ttreenode集。一 針對ttreenodes,也就是 treeview.items,有這些屬性 1 count,節點個數。2 item index 通過index得...