Celery的安裝和使用

2021-07-04 05:34:33 字數 3031 閱讀 6792

參考:celery官方文件英文版

celery官方文件中文版:

celery是乙個分布式任務佇列工具,是乙個非同步的任務佇列基於分布式訊息傳遞。更多介紹可以參考 官網

在celery中幾個基本的概念,需要先了解下,不然不知道為什麼要安裝下面的東西。概念:broker、backend。

其中broker的中文意思是 經紀人 ,其實就是一開始說的 訊息佇列 ,用來傳送和接受訊息。這個broker有幾個方案可供選擇:rabbitmq,redis(丟資料),資料庫(不推薦),等等

後面的那個backend是在celery的配置中的乙個配置項 celery_result_backend ,作用是儲存結果和狀態,如果你需要跟蹤任務的狀態,那麼需要設定這一項,可以是database backend,也可以是cache backend,具體可以參考這裡: celery_result_backend 。

我自己演示使用rabbitmq作為broker,用mysql作為backend。

有了上面的概念,需要安裝這麼幾個東西:rabbitmq、sqlalchemy、celery

安裝方式也都很簡單: rabbitmq:

mac下:

brew install rabbitmq

linux:

sudo apt-get install rabbitmq-server

剩下兩個都是python的東西了,直接pip安裝就好了,對於從來沒有安裝過mysql驅動的同學可能需要安裝mysql-python。

安裝完成之後,啟動服務:

$ rabbitmq-server[回車]
啟動後不要關閉視窗, 下面操作新建視窗(tab)

3.1 確保你之前的rabbitmq已經啟動。

還是官網的那個例子,在任意目錄新建乙個tasks.py的檔案,內容如下:

from celery import celery

def add(x, y):

return x + y

3.2 使用redis作為訊息佇列

celery_task_serializer='json',

celery_accept_content=['json'], # ignore other content

celery_result_serializer='json',

celeryd_concurrency = 8

)def add(x, y):

return x + y

在同級目錄執行:

保持視窗開啟,新開乙個視窗進入互動模式,python或者ipython:

>>> from tasks import add

>>> add.delay(4, 4)

到此為止,你已經可以使用celery執行任務了,上面的python互動模式下簡單的呼叫了add任務,並傳遞4,4引數。

但此時有乙個問題,你突然想知道這個任務的執行結果和狀態,到底完了沒有。因此就需要設定backend了。

修改之前的tasks.py中的**為:

# coding:utf-8

import subprocess

from time import sleep

from celery import celery

backend = 'db+mysql:'

broker = 'amqp:'

def add(x, y):

sleep(10)

return x + y

def hostname():

return subprocess.check_output(['hostname'])

除了新增backend之外,上面還新增了乙個who的方法用來測試多伺服器操作。修改完成之後,還是按照之前的方式啟動。

同樣進入python的互動模型:

>>> from tasks import add, hostname

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

>>> r.ready() # 10s內執行,會輸出false,因為add中sleep了10s

>>>

>>> r = hostname.delay()

>>> r.result # 輸出你的hostname

做完上面的測試之後,產生了乙個疑惑,celery叫做分布式任務管理,那它的分布式體現在哪?它的任務都是怎麼執行的?在哪個機器上執行的?

在當前伺服器上的celery服務不關閉的情況下,按照同樣的方式在另外一台伺服器上安裝celery,並啟動:

$ celery -a tasks worker --loglevel=info
發現前乙個伺服器的celery服務中輸出你剛啟動的伺服器的hostname,前提是那台伺服器連上了你的rabbitmq。

然後再進入python互動模式:

>>> from tasks import hostname

>>>

>>> for i in range(10):

... r = hostname.delay()

... print r.result # 輸出你的hostname

>>>

看你輸入的內容已經觀察兩台伺服器上你啟動celery服務的輸出。

一開始測試時遠端伺服器無法連線本地的rabbitmq服務,後來發現需要設定許可權,在/usr/local/etc/rabbitmq/rabbitmq-env.conf這個檔案中,修改node_ip_address=127.0.0.1中的ip為0.0.0.0。

這篇文章簡單的介紹了celery的使用,重點還是在分布式的使用。覺得不太爽的地方是,在擴充套件時,需要重新把**(tasks.py)部署一遍,而不是可以直接把tasks進行共享,可能celery是通過task來進行不同的worker的匹配的?目前還不太了解,等深入使用之後再說。

celery的安裝及使用

pip install celery celery task main.py import os from celery import celery 定義celery例項,需要的引數,1,例項名,2,任務發布位置,3,結果儲存位置 mycelery broker redis 任務存放的地方 back...

celery的使用介紹

celery是專注實時處理和任務排程的分布式任務佇列。主要應用場景 1,web應用,當需要觸發事件需要較長時間處理完成,可以交給celery進行非同步執行,執行完後返回結果,這段時間不用等待,提高系統的吞吐量和響應時間。2,完成任務時,需要額外的事件處理,如傳送郵件等。3,後台定時任務處理,cele...

Celery的基本使用

celery是乙個簡單 靈活且可靠的,處理大量訊息的分布式系統 專注於實時處理的非同步任務佇列 同時也支援任務排程 celery 官網 celery 官方文件英文版 celery 官方文件中文版 ps celery在windows系統上會出現不相容的情況1.可以不依賴任何伺服器,通過自身命令,啟動服...