Celery 小試牛刀

2022-09-11 11:48:14 字數 3204 閱讀 8775

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 目...