Celery 簡介與設定

2021-07-10 14:15:50 字數 2396 閱讀 2623

celery (芹菜)是基於python開發的分布式任務佇列。它支援使用任務佇列的方式在分布的機器/程序/執行緒上執行任務排程。

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

訊息中介軟體

celery本身不提供訊息服務,但是可以方便的和第三方提供的訊息中介軟體整合。包括,rabbitmq, redis, mongodb (experimental), amazon sqs (experimental),couchdb (experimental), sqlalchemy (experimental),django orm (experimental), ironmq

任務執行單元

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

任務結果儲存

task result store用來儲存worker執行的任務的結果,celery支援以不同方式儲存任務的結果,包括amqp, redis,memcached, mongodb,sqlalchemy, django orm,apache cassandra, ironcache

另外, celery還支援不同的併發和序列化的手段。

併發

prefork, eventlet, gevent, threads/single threaded

序列化

pickle, json, yaml, msgpack. zlib, bzip2 compression, cryptographic message signing 等等

使用的是django-celery包:

pip install django-djcelery
下面是djcelery的有關配置,定義在django專案的settings模組內。

之後配置celery

說明:直接使用django做broker生產環境不建議,建議使用redis或者rabbitmq

需要在settings.py之中載入celery的配置。

配置好了celery之後需要建立celery所需要的資料表(django1.7)

python manage.py migrate
from celery import task

@task()

defadd

(x, y):

return x + y

將function標註為task並不會妨礙他們的正常執行. 你還是可以像平時那樣呼叫它:

z = add(1, 2).
celery之中你可以用 delay() 方法來呼叫任務。

讓我們以乙個簡單的例子作為開始. 例如我們希望在使用者發出request後非同步執行該task, 馬上返回response, 從而不阻塞該request, 使使用者有乙個流暢的訪問過程. 那麼, 我們可以使用.delay, 例如在在views.py的乙個view中:

...add.delay(2, 2)

...

celery會將task加入到queue中, 並馬上返回. 而在一旁待命的worker看到該task後, 便會按照設定執行它, 並將他從queue中移除. 而worker則會執行以下**:

正如之前說到的, 我們需要worker來執行task. 以下是在開發環境中的如何啟動worker:

首先啟動terminal, 如同開發django專案一樣, 啟用virtualenv, 切換到django專案目錄. 然後啟動django自帶web伺服器: python manage.py runserver.

然後啟動worker:

python manage.py celery worker –loglevel=info

此時, worker將會在該terminal中執行, 並顯示輸出結果.

啟動task

開啟新的terminal, 啟用virtualenv, 並切換到django專案目錄:

Python之celery的簡介與使用

celery是乙個基於分布式訊息傳輸的非同步任務佇列,它專注於實時處理,同時也支援任務排程。它的執行單元為任務 task 利用多執行緒,如eventlet,gevent等,它們能被併發地執行在單個或多個職程伺服器 worker servers 上。任務能非同步執行 後台執行 或同步執行 等待任務完成...

celery原理與元件

1.celery 是乙個 基於python開發的 分布式非同步訊息任務佇列 通過它可以輕鬆的實現任務的非同步處理,如果你的業務場景中需要用到非同步任務,就可以考慮使用celery 2.你想對100臺機器執行一條批量命令,可能會花很長時間 但你不想讓你的程式等著結果返回,而是給你返回 乙個任務id,你...

celery原理與元件

定義celery例項,需要的引數,1,例項名,2,任務發布位置,3,結果儲存位置 broker redis 任務存放的地方 backend redis 結果存放的地方 def add x,y return x y 1.啟動celery 1.1 單程序啟動celery celery a main wo...