標籤:工作環境 python result single 第三方
最近,換了一個工作環境去做研究,當然啦,新公司新作風,需要研究python並行分布式架構:Celery,不用多說,幹唄。
然後就抽空看了一下,果然介面簡單,開發容易,5分鐘就寫出了一個非同步發送郵件的服務。
Celery本身不含Message Service,它使用第三方Message Service來傳遞任務,目前,Celery支援的Message Service有RabbitMQ、Redis甚至是資料庫,當然Redis應該是最佳選擇。
任務執行單元
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 等等
不廢話,上初步研究的代碼:
import sysreload(sys)import timefrom celery import Celeryapp = Celery(‘tasks‘, broker = ‘redis://localhost:6379/0‘)@app.task()def sendmail(mail): print(‘sending mail to %s...‘ % mail[‘to‘]) time.sleep(2.0) print(‘mail sent.‘)
我是直接連的redis。
然後啟動Celery處理任務:
celery -A tasks worker --loglevel=info
上面的命令列實際上啟動的是Worker,如果要放到後台運行,可以扔給supervisor。
如何發送任務?非常簡單:
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M01/8F/7D/wKioL1jhUDPj95uTAAR1BuJDw7E298.png-wh_500x0-wm_3-wmp_4-s_2576684765.png" title="深度20170403032501.png" alt="wKioL1jhUDPj95uTAAR1BuJDw7E298.png-wh_50" />
可以看到,Celery的API設計真的非常簡單。
然後,在Worker裡就可以看到任務處理的訊息:
650) this.width=650;" src="https://s5.51cto.com/wyfs02/M00/8F/7F/wKiom1jhUH2AT-NgAAS4nmOeEXs818.png-wh_500x0-wm_3-wmp_4-s_1934919965.png" title="深度20170403032629.png" alt="wKiom1jhUH2AT-NgAAS4nmOeEXs818.png-wh_50" />
這裡我們可以發現,每一個task有一個唯一的ID,task非同步執行在worker上。
Celery預設設定就能滿足基本要求。Worker以Pool模式啟動,預設大小為CPU核心數量,預設序列化機制是pickle,但可以指定為json。由於Python調用UNIX/Linux程式實在太容易,所以,用Celery作為非同步任務架構非常合適。
Celery還有一些進階用法,比如把多個工作群組合成一個原子任務等,還有一個完善的監控介面,以後有空再繼續研究。
本文出自 “Microsoft” 部落格,請務必保留此出處http://1238306.blog.51cto.com/1228306/1912637
Python Celery初研究