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 celerydef 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可以更好的利...