celery 由於 其分布式體系結構,在某種程度上可能難以理解。下圖是典型django-celery設定的高階示意圖(from o'reilly):
當請求到達時,您可以在處理它時呼叫celery任務。呼叫任務的函式會立即返回,而不會阻塞當前程序。實際上,任務尚未完成執行,但是任務訊息已進入任務佇列(或許多可能的任務佇列之一)。
workers 是獨立的程序,用於監視任務佇列中是否有新任務並實際執行它們,他們拿起任務訊息、處理任務、儲存結果。
celery需要乙個傳送和接收訊息的解決方案,即乙個訊息**(message broker)服務,常用的broker包括:
rabbitmq功能齊全,穩定,耐用且易於安裝,是生產環境的絕佳選擇。
ubuntu安裝:
$ sudo apt-get install rabbitmq-server
docker安裝:
redis也具有完整的功能,但是在突然終止或電源故障的情況下更容易丟失資料。
ubuntu安裝:
$ sudo apt install redis-server
docker安裝:
$ docker run -d -p 6379:6379 redis
$ pip install celery
首先匯入celery,建立乙個celery物件,這個物件將作為乙個操作 celery 的入口,如建立任務,管理workers等。
以下示例會把所有東西都寫在乙個模組中,但是對於大型專案,您需要建立乙個專用模組。
# tasks.py
import time
from celery import celery
def add(x, y):
print('--------start---------')
for i in range(5):
print(f'第秒')
print('--------over----------')
return x + y
第乙個引數是當前模組的名稱,這是唯一的必需引數。
第二個引數指定要使用的訊息**的url。這裡使用rabbitmq(也是預設選項)。
若使用redis:
$ celery -a tasks worker --loglevel=info
在生產環境中,需要在後台將工作程式作為守護程式執行。為此,需要使用 平台提供的工具 或 類似supervisord的工具
(詳情參閱 呼叫任務):
呼叫任務將返回乙個asyncresult
例項,這可用於檢查任務的狀態,等待任務完成或獲取其返回值(或者如果任務失敗,則獲取異常和回溯)
預設情況下執行任務不返回結果。為了執行遠端過程呼叫或跟蹤資料庫中的任務結果,需要配置result backend
。
如果要跟蹤任務的狀態,celery需要將狀態儲存或傳送到某個地方。有多個result backend
可供選擇:sqlalchemy / django orm, mongodb,memcached,redis,rpc(rabbitmq / amqp)等。
下面使用 rpc 作為result backend
,該後端將狀態作為瞬態訊息傳送回去。使用backend
引數配置celery物件的result backend
:
或者,如果使用 redis 作為result backend
,但仍然使用 rabbitmq 作為broker
(流行的組合):
更多result backend
配置參閱「result backend。
我們再次呼叫該任務:
>>> result = add.delay(4, 4)
>>> result.ready() # 檢查是否完成任務,返回布林值
的完整參考
對於大多數使用情況,預設配置就夠了,但是可以配置更多選項使celery根據需要工作。詳細配置見「配置和預設值」。
可以直接在應用程式上設定配置,也可以使用專用的配置模組設定配置。例如配置用於序列化任務負載的預設序列化器:
# 配置乙個設定:
# 一次配置許多設定,則可以使用update
task_serializer='json',
accept_content=['json'], # ignore other content
result_serializer='json',
timezone='europe/oslo',
enable_utc=true,
)
對於較大的專案,建議使用專用的配置模組。
celeryconfig.py
必須可用於從當前目錄或python路徑中載入
celeryconfig.py
broker_url = 'pyamqp://'
result_backend = 'rpc://'
task_serializer = 'json'
result_serializer = 'json'
accept_content = ['json']
timezone = 'europe/oslo'
enable_utc = true
boost graph lib 小試牛刀
最近要做社會網路的社群發現,發現用bgl能減少不少 量。經過一番調研發現bgl封裝的很牛叉,dijkstra等演算法統統具備,奈何自己對泛型程式設計不太熟,遇到問題還是很糾結。primer泛型程式設計 演算法部分和stl原始碼分析接下來有時間一定要讀下。下面僅以鄰接鍊錶和自定義節點為例 typede...
Anti Debug 小試牛刀
本文整理了日常生活中遇到的一些anti debug技術,除非特殊說明,均適用於mac ios開發 作為第一篇正式博文,會不定期更新,謝謝大家.123 4567 89 define pt deny attach 31 include intmain 程式正常執行,會輸出hello 但是程式載入到gdb...
tsung小試牛刀
linux環境 centos5.5 1 tsung安裝 tar zxvf tsung 1.4.2.tar.gz configure make sudo make install 安裝後執行 which tsung,如果顯示 usr bin tsung 表明安裝成功 2 設定 如果沒有 tsung 目...