Celery 是 Distributed Task Queue 分布式任務(wù)隊(duì)列碗淌。
不太理解異步任務(wù)隊(duì)列脚草,看到有人說:
分布式異步任務(wù)隊(duì)列的作用就是把 python 代碼放到不同的環(huán)境上面去跑竿奏, 核心難題就是如何序列化和反序列化函數(shù)裂逐, 函數(shù)都有復(fù)雜的依賴關(guān)系追逮,調(diào)用系統(tǒng)函數(shù)霜威,或者用戶自定義函數(shù)谈喳, 這些依賴都要一起序列化傳輸。暫時(shí)先這么理解
Celery 基本工作就是管理分配任務(wù)到不同的服務(wù)器上戈泼,并且取得相應(yīng)的結(jié)果婿禽,至于服務(wù)器之間是如何通信的,Celery 并不能解決這個(gè)問題大猛。
Celery 分為三部分:消息中間件 broker扭倾,任務(wù)執(zhí)行單元 worker 和 任務(wù)結(jié)果存儲。
broker:消息傳輸?shù)闹虚g件挽绩。每當(dāng)應(yīng)用程序調(diào)用 celery 的異步任務(wù)時(shí)膛壹,會向 broker 傳遞消息。然后 worker 會取到消息唉堪。就是一個(gè)消息隊(duì)列模聋。broker 選擇方案:RabbitMQ,Redis
backend:存儲消息以及 celery 執(zhí)行的一些消息和結(jié)果唠亚。有數(shù)據(jù)庫和 redis 可選链方。
直接 pip install celery
即可安裝灶搜。
一般目錄格式:
project/__init__.py
/celery.py
/tasks.py
# project.celery.py
from __future__ import absolute_import, unicode_literals
from celery import Celery
app = Celery('proj',
broker='redis://',
backend='redis://',
include=['project.tasks'])
# Optional configuration, see the application user guide.
app.conf.update(
result_expires=3600,
)
if __name__ == '__main__':
app.start()
# project/tasks.py
from __future__ import absolute_import, unicode_literals
from .celery import app
@app.task
def add(x, y):
return x + y
celery 啟動 worker
celery -A 項(xiàng)目名稱 worker -l info/debug
配置多個(gè) worker
celery multi start w1 -A poject -l info
celery 啟動定時(shí)任務(wù) beat
celery -A 項(xiàng)目名稱.任務(wù)文件 beat -l info/debug
Django 結(jié)合 celery祟蚀,可以使用 pip install django-celery
注:在 CentOs 中工窍,我的 Python3 環(huán)境是編譯源代碼安裝的,在
pip3 install celery
之后前酿,bash 總說找不到命令 celery患雏。但是 Python2 環(huán)境下可以安裝成功。很迷薪者。纵苛。。