Python 並行分布式框架 Celery

2022-07-30 00:39:09 字數 4002 閱讀 1821

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

架構設計

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

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

安裝和執行

首先我選擇rabbitmq作為訊息中介軟體,所以要先安裝rabbitmq。作為安裝準備,先更新yum。?1

sudoyum -y update

rabbitmq是基於erlang的,所以先安裝erlang?1

然後安裝rabbitmq?1

2345

6# download the latest rabbitmq package using wget:

wget

# add the necessary keys for verification:

rpm --import

# install the .rpm package using yum:

yuminstallrabbitmq-server-3.2.2-1.noarch.rpm

啟動rabbitmq服務?1

rabbitmq-server start

rabbitmq服務已經準備好了,然後安裝celery, 假定你使用pip來管理你的python安裝包?1

pipinstallcelery

為了測試celery是否工作,我們執行乙個最簡單的任務,編寫tasks.py?1

2345

678fromceleryimportcelery

=celery('tasks', backend='amqp', broker='amqp://guest@localhost//')

='db+sqlite:/'

.task

defadd(x, y):

returnx+y

在當前目錄執行乙個worker,用來執行這個加法的task?1

celery -a tasks worker --loglevel=info

worker日誌中我們會看到這樣的資訊?1

2345

- ** ---------- [config]

- ** ---------- .> transport:   amqp://guest:**@localhost:5672//

- ** ---------- .> results:     db+sqlite:///results.sqlite

- *** --- * --- .> concurrency: 8 (prefork)

其中,我們可以看到worker預設使用prefork來執行併發,並設定併發數為8

下面的任務執行的客戶端**:?1

2345

6789

fromtasksimportadd

importtime

result=add.delay(4,4)

whilenotresult.ready():

print"not ready yet"

time.sleep(5)

printresult.get()

用python執行這段客戶端**,在客戶端,結果如下?1

2not ready

8

work日誌顯示?1

2[2015-03-12 02:54:07,973: info/mainprocess] received task: tasks.add[34c4210f-1bc5-420f-a421-1500361b914f]

[2015-03-12 02:54:08,006: info/mainprocess] task tasks.add[34c4210f-1bc5-420f-a421-1500361b914f] succeededin0.0309705100954s: 8

這裡我們可以發現,每乙個task有乙個唯一的id,task非同步執行在worker上。

這裡要注意的是,如果你執行官方文件中的例子,你是無法在客戶端得到結果的,這也是我為什麼要使用sqlalchemy來儲存任務執行結果的原因。官方的例子使用ampq,有可能worker在列印日誌的時候取出了task的執行結果顯示在worker日誌中,然而ampq作為乙個訊息佇列,當訊息被取走後,佇列中就沒有了,於是客戶端總是無法得到任務的執行結果。不知道為什麼官方文件對這樣的錯誤視而不見。

如果大家想要對celery做更進一步的了解,請參考官方文件

分布式 常見分布式框架

分布式協調系統 日誌複製系統 paxos演算法及其變體的實現,典型的有zookeeper etcd 分布式檔案系統 hdfs hadoop 分布式nosql redis hbase 訊息佇列 rabbitmq kafka,關注訊息的at least once,at most once,only on...

複習 分布式框架

springcloud與dubbo可以實現rpc遠端呼叫框架,可以實現服務治理 相同點 springcloud是一套目前比較全面 不同點 的微服務框架,整合了分布式常用的解決方案 文件 eureka 工作原理 eureka與zookeeper的差別 技術角度 dubbo 工作原理 ribbon 原理...

分布式框架 dnmap

dnmap是乙個用python語言寫的分布式掃瞄的nmap掃瞄框架,我們可以用dnmap來通過多台機器發起乙個大規模的掃瞄,dnmap採用c s 結構,執行大量掃瞄任務時非常便捷,掃瞄結果可以統 一管理。使用者在伺服器端設定好nmap工具執行的命令,dnmap框架會自動地分配給客戶端進行掃瞄,並將掃...