參考資料來源:
https://www.cnblogs.com/alex3714/p/6351797.html
Celery的相關(guān)介紹和說明
Celery3.7的中文文檔:
http://docs.jinkan.org/docs/celery/getting-started/first-steps-with-celery.html
1:Celery的作用主要是用于做相關(guān)的--異步任務(wù)神器
2:結(jié)合redis作為中間件主要用戶任務(wù)的存儲(chǔ)和處理結(jié)果的存儲(chǔ)
Celery有以下優(yōu)點(diǎn)(抄參考資料來源):
(1)簡(jiǎn)單:一單熟悉了celery的工作流程后值朋,配置和使用還是比較簡(jiǎn)單的
(2)高可用:當(dāng)任務(wù)執(zhí)行失敗或執(zhí)行過程中發(fā)生連接中斷背蟆,celery 會(huì)自動(dòng)嘗試重新執(zhí)行任務(wù)
(3)快速:一個(gè)單進(jìn)程的celery每分鐘可處理上百萬個(gè)任務(wù)
(4)靈活: 幾乎celery的各個(gè)組件都可以被擴(kuò)展及自定制
案例實(shí)踐步驟
說明:該示例是實(shí)踐參考https://www.cnblogs.com/alex3714/p/6351797.html
使用Redis做broker俗壹!
配置Redis作為中間件
相關(guān)格式:redis://:password@hostname:port/db_number
redis://:password@hostname:port/db_number
或
redis://localhost:6379/0
第1步:安裝redis
(安裝參考:http://www.reibang.com/p/c450612c6295)
第2步:安裝celery模塊
# pip install celery
第3步:安裝celery-with-redis或者直接安裝reids模塊模塊
# pip install celery-with-redis
或
# pip install redis
第4步:啟動(dòng)redis-server服務(wù)
# redis-server /usr/local/redis/redis.conf
# 啟動(dòng)成功如圖示:
[root@localhost ~]# ps -ef |grep redis
root 5620 1 0 03:06 ? 00:00:03 redis-server 0.0.0.0:6379
root 5795 5778 0 03:52 pts/2 00:00:00 grep --color=auto redis
[root@localhost ~]#
第5步:編寫異步任務(wù)測(cè)試示例麻养,命名為tasks.py
注:此地方示例使用到了python3榜晦,所以請(qǐng)先提前安裝好python3的環(huán)境
# cd /data/app/celeryTest/
# touch tasks.py
# nano tasks.py
把下面的代碼保存到tasks.py文件中
from celery import Celery
app = Celery('tasks',
broker='redis://:123456@localhost:6379/0',
backend='redis://:123456@localhost:6379/1')
@app.task
def add(x,y):
print("running...",x,y)
return x+y
代碼片段說明:
broker='redis://localhost‘ :任務(wù)存貯
backend='redis://localhost':任務(wù)結(jié)果存貯
第6步:啟動(dòng)Celery Worker來開始監(jiān)聽并執(zhí)行任務(wù)
注:執(zhí)行啟動(dòng)任務(wù)需進(jìn)入到tasks.py文件所在的目錄下面
說明: 命令行執(zhí)行celery worker -A <app> --loglevel=info時(shí),<app>必須可導(dǎo)入,所以可以為PY模塊或包,但需要注意的不管是包還是模塊都必須正確指定Celery入口文件(如果為包則默認(rèn)的入口文件名為celery.py)的絕對(duì)導(dǎo)入名稱(app/work.app),Celery通過動(dòng)態(tài)導(dǎo)入獲取實(shí)例化后的應(yīng)用,通過實(shí)例化時(shí)指定的配置以及include來依次導(dǎo)入任務(wù)執(zhí)行文件中的任務(wù)指定單元,然后就是等待任務(wù),可以看出Celery是通過相對(duì)/絕對(duì)導(dǎo)入來查找定義的任務(wù)執(zhí)行單元,PY導(dǎo)入成功后會(huì)生成PYC文件,所以代碼修改后一定要先刪除PYC文件.(來源:http://blog.51cto.com/xmdevops/1885857)
#cd /data/app/celeryTest/
# celery -A tasks worker --loglevel=info
**--broker** URL(transport)是我們?cè)赾elery模塊中指定的broker關(guān)鍵字參數(shù)狗超,你也可以通過-b選項(xiàng)在命令行指定一個(gè)不同的broker.
**--concurrency **是用來執(zhí)行任務(wù)而prefork的worker進(jìn)程丝格,如果所有的worker都在執(zhí)行任務(wù)唠梨,那么新添加的任務(wù)必須要等待有一個(gè)正在執(zhí)行的任務(wù)完成后才能被執(zhí)行算芯。
默認(rèn)的concurrency數(shù)量是機(jī)器上CPU的數(shù)量柒昏,你可以指定一個(gè)數(shù)量通過-c選項(xiàng)([
celery worker -c](http://docs.celeryproject.org/en/master/reference/celery.bin.worker.html#cmdoption-celery-worker-c) )。在這里沒有推薦值熙揍,因?yàn)樽顑?yōu)值依懶許多因素职祷,但是如果你的任務(wù)大部分都是I/O相關(guān)的,你可以嘗試增加這個(gè)值,實(shí)驗(yàn)證明增加到2倍以上于CPU數(shù)的值對(duì)性能提高微乎其微有梆,相反還會(huì)降低性能是尖。
除了默認(rèn)的進(jìn)程池,Celery還支持使用Eventlet,Gevent和線程(查看 Concurrency)
--Events是一個(gè)選項(xiàng)泥耀,它可以用來使Celery在worker中有事件發(fā)生時(shí)發(fā)送監(jiān)控消息(events)饺汹。這些信息可以被一些監(jiān)控程序使用,比如celery events和Flower---一個(gè)實(shí)時(shí)的Celery monitor,更多詳細(xì)介紹可以查看Monitoring and Management guide.
--Queuens是一個(gè)隊(duì)列列表痰催,workers將會(huì)從中消費(fèi)任務(wù)兜辞。可以告訴worker一次性地從多個(gè)隊(duì)列中消費(fèi)任務(wù)夸溶,這可以用來路由消息給指定的worker逸吵。這對(duì)于構(gòu)建高質(zhì)量的服務(wù),關(guān)系的分離和提供優(yōu)先級(jí)都有意義蜘醋。具體的描述參考Routing Guide.
第7步:開啟新的會(huì)話窗口
啟動(dòng)Celery Worker來開始監(jiān)聽并執(zhí)行任務(wù)窗口:
派發(fā)任務(wù)給Celery Worker窗口:
第8步:(非必須)查看任務(wù)結(jié)果
看你的worker終端會(huì)顯示收到 一個(gè)任務(wù)胁塞,此時(shí)你想看任務(wù)結(jié)果的話,需要在調(diào)用 任務(wù)時(shí) 賦值個(gè)變量
>>> result = add.delay(4, 4)
遠(yuǎn)程連接redis查看對(duì)應(yīng)信息: