非同步任務利器Celery 一 介紹

2022-07-04 00:00:19 字數 2174 閱讀 1234

django專案開發中遇到過一些問題,傳送請求後伺服器要進行一系列耗時非常長的操作,使用者要等待很久的時間。可不可以立刻對使用者返回響應,然後在後台執行那些操作呢?

crontab定時任務很難達到這樣的要求 ,非同步任務是很好的解決方法,有乙個使用python寫的非常好用的非同步任務工具celery。

celery的架構由三部分組成,訊息中介軟體(broker),任務執行單元(worker)和任務執行結果儲存(result backends)組成。

應用程式呼叫celery的時候,會向broker傳遞訊息,而後worker將會取到訊息,對程式進行執行,backend用於儲存這些訊息以及celery執行的結果。

訊息中介軟體broker

celery本身不提供訊息服務,但是可以方便的和第三方提供的訊息中介軟體整合。

rabbitmq是最好的訊息中介軟體,使用方法如下:

using rabbitmq

redis也是可行的,雖然有資訊丟失的風險:

using redis

其餘broker broker overview。

任務執行單元worker

worker是celery提供的任務執行的單元,worker併發的執行在分布式的系統節點中。

任務結果儲存backend

用來儲存worker執行的任務的結果:sqlalchemy/django orm, memcached, redis, rpc

(rabbitmq/amqp)。

$ pip install celery

$ pip install -u "celery[redis]"

寫乙個簡單的應用tasks.py:

from celery import celery

def add(x, y):

return x + y

在命令列中執行:

$ celery -a tasks worker --loglevel=info

輸出如下:

[2017-09-10 06:59:58,665: info/mainprocess] connected to redis://localhost:6379/0

[2017-09-10 06:59:58,671: info/mainprocess] mingle: searching for neighbors

[2017-09-10 06:59:59,688: info/mainprocess] mingle: all alone

[2017-09-10 06:59:59,724: info/mainprocess] celery@ubuntu ready.

進入python環境:

>>> from tasks import add

>>> add.delay(4, 4)

worker裡就可以看到任務處理的訊息:

[2017-09-10 07:02:34,874: info/mainprocess] received task: task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb]  

[2017-09-10 07:02:34,876: info/forkpoolworker-1] task task.add[40ec89c8-0a23-4a26-9da0-7f418c50f4cb] succeeded in 0.000579041981837s: 8

使用redis作為儲存backend,在tasks.py中修改:

執行後就可以檢視結果了:

>>> from task import add

>>> r=add.delay(3,4)

>>> r.result

7>>> r.ready()

true

>>> r.get(timeout=1)

7

可以檢視redis中的儲存:

127.0.0.1:6379> get celery-task-meta-f2032d3e-f9a0-425d-bce4-f55ce58c8706

""127.0.0.1:6379>

超級簡單,想要對celery做更進一步的了解,請參考官方文件。

非同步任務利器Celery 一 介紹

django專案開發中遇到過一些問題,傳送請求後伺服器要進行一系列耗時非常長的操作,使用者要等待很久的時間。可不可以立刻對使用者返回響應,然後在後台執行那些操作呢?crontab定時任務很難達到這樣的要求 非同步任務是很好的解決方法,有乙個使用python寫的非常好用的非同步任務工具celery。c...

非同步任務利器Celery 一 介紹

django專案開發中遇到過一些問題,傳送請求後伺服器要進行一系列耗時非常長的操作,使用者要等待很久的時間。可不可以立刻對使用者返回響應,然後在後台執行那些操作呢?crontab定時任務很難達到這樣的要求 非同步任務是很好的解決方法,有乙個使用python寫的非常好用的非同步任務工具celery。c...

Spring Batch學習(一)介紹

我們不會總是想要立即得到需要的資訊,批處理允許我們在請求處理之前就乙個既定的流程開始蒐集資訊 比如說乙個銀行對賬單,我們可以按月生成,並在使用者查詢之前開啟乙個批處理流程進行處理 更好的利用資源 讓應該利用的處理能力閒置起來是乙個大的浪費,我們可以定製處理讓乙個機器乙個接乙個的執行job可以更好的利...