Python之celery的簡介與使用

celery的簡介

??celery是一個基于分布式消息傳輸的異步任務隊列,它專注于實時處理,同時也支持任務調度。它的執行單元為任務(task),利用多線程,如Eventlet,gevent等,它們能被并發地執行在單個或多個職程服務器(worker servers)上。任務能異步執行(后臺運行)或同步執行(等待任務完成)。
??在生產系統中,celery能夠一天處理上百萬的任務。它的完整架構圖如下:

celery架構圖

組件介紹:

  • Producer:調用了Celery提供的API、函數或者裝飾器而產生任務并交給任務隊列處理的都是任務生產者。
  • Celery Beat:任務調度器,Beat進程會讀取配置文件的內容,周期性地將配置中到期需要執行的任務發送給任務隊列。
  • Broker:消息代理,又稱消息中間件,接受任務生產者發送過來的任務消息,存進隊列再按序分發給任務消費方(通常是消息隊列或者數據庫)。Celery目前支持RabbitMQ、Redis、MongoDB、Beanstalk、SQLAlchemy、Zookeeper等作為消息代理,但適用于生產環境的只有RabbitMQ和Redis, 官方推薦 RabbitMQ。
  • Celery Worker:執行任務的消費者,通常會在多臺服務器運行多個消費者來提高執行效率。
  • Result Backend:任務處理完后保存狀態信息和結果,以供查詢。Celery默認已支持Redis、RabbitMQ、MongoDB、Django ORM、SQLAlchemy等方式。

??在客戶端和消費者之間傳輸數據需要序列化和反序列化。 Celery 支出的序列化方案如下所示:

celery序列化

準備工作

??在本文中,我們使用的celery的消息代理和后端存儲數據庫都使用redis,序列化和反序列化選擇msgpack。
??首先,我們需要安裝redis數據庫,具體的安裝方法可參考:http://www.runoob.com/redis/r... 。啟動redis,我們會看到如下界面:

redis啟動

在redis可視化軟件rdm中,我們看到的數據庫如下:

rdm

里面沒有任何數據。
??接著,為了能夠在python中使用celery,我們需要安裝以下模塊:

  • celery
  • redis
  • msgpack

這樣,我們的準備工作就完畢了。

一個簡單的例子

??我們創建的工程名稱為proj,結構如下圖:

??首先是主程序app_test.py,代碼如下:

from celery import Celeryapp = Celery('proj', include=['proj.tasks'])
app.config_from_object('proj.celeryconfig')if __name__ == '__main__':app.start()

分析一下這個程序:

  1. "from celery import Celery"是導入celery中的Celery類。
  2. app是Celery類的實例,創建的時候添加了proj.tasks這個模塊,也就是包含了proj/tasks.py這個文件。
  3. 把Celery配置存放進proj/celeryconfig.py文件,使用app.config_from_object加載配置。

??接著是任務函數文件tasks.py,代碼如下:

import time
from proj.app_test import app@app.task
def add(x, y):time.sleep(1)return x + y

tasks.py只有一個任務函數add,讓它生效的最直接的方法就是添加app.task這個裝飾器。add的功能是先休眠一秒,然后返回兩個數的和。

??接著是配置文件celeryconfig.py,代碼如下:

BROKER_URL = 'redis://localhost' # 使用Redis作為消息代理CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 把任務結果存在了RedisCELERY_TASK_SERIALIZER = 'msgpack' # 任務序列化和反序列化使用msgpack方案CELERY_RESULT_SERIALIZER = 'json' # 讀取任務結果一般性能要求不高,所以使用了可讀性更好的JSONCELERY_TASK_RESULT_EXPIRES = 60 * 60 * 24 # 任務過期時間CELERY_ACCEPT_CONTENT = ['json', 'msgpack'] # 指定接受的內容類型

??最后是調用文件diaoyong.py,代碼如下:

from proj.tasks import add
import timet1 = time.time()r1 = add.delay(1, 2)
r2 = add.delay(2, 4)
r3 = add.delay(3, 6)
r4 = add.delay(4, 8)
r5 = add.delay(5, 10)r_list = [r1, r2, r3, r4, r5]
for r in r_list:while not r.ready():passprint(r.result)t2 = time.time()print('共耗時:%s' % str(t2-t1))

在這個程序中,我們調用了add函數五次,delay()用來調用任務。

例子的運行

??到此為止,我們已經理解了整個項目的結構與代碼。
??接下來,我們嘗試著把這個項目運行起來。
??首先,我們需要啟動redis。接著,切換至proj項目所在目錄,并運行命令:

celery -A proj.app_test worker -l info

界面如下:

celery啟動

然后,我們運行diaoyong.py,輸出的結果如下:

3
6
9
12
15
共耗時:1.1370790004730225

后臺輸出如下:

celery后臺運行

接著,我們看一下rdm中的數據:

rdm中的數據

至此,我們已經成功運行了這個項目。
??下面,我們嘗試著對這個運行結果做些分析。首先,我們一次性調用了五次add函數,但是運行的總時間才1秒多。這是celery異步運行的結果,如果是同步運行,那么,至少需要5秒多,因為每調用add函數一次,就會休眠一秒。這就是celery的強大之處。
??從后臺輸出可以看到,程序會先將任務分發出來,每個任務一個ID,在后臺統一處理,處理完后會有相應的結果返回,同時該結果也會儲存之后臺數據庫。可以利用ready()判斷任務是否執行完畢,再用result獲取任務的結果。
??本文項目的github地址為:https://github.com/percent4/c... 。
??本次分享到此結束,感謝閱讀~
??注意:本人現已開通微信公眾號: Python爬蟲與算法(微信號為:easy_web_scrape), 歡迎大家關注哦~~

參考文獻

  1. Celery 初步:http://docs.jinkan.org/docs/c...
  2. 使用Celery:https://zhuanlan.zhihu.com/p/...
  3. 異步神器celery:https://www.jianshu.com/p/9be...

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/537001.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/537001.shtml
英文地址,請注明出處:http://en.pswp.cn/news/537001.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

不使用比較運算符如何比較兩個數的大小

分享一波:程序員賺外快-必看的巔峰干貨 前言 今天在水群的過程中看到有位群員談論到這個話題,是他找工作過程中某家公司的面試題(到底是哪家公司才會出這種沒營養的題目刁難別人),有點興趣,就開始寫了。 開搞 想了一…

java占位符填充_Java使用freemark生成word

1、制作模板先用office word做一個模板word文檔,${usrName}、${nowDate}占位符 可以使用 office 或者 wps 先創建一個模板表格 (替換$部分可以在 模板格式改變之后 在替換xml 格式改了后有些原本的字符會分開)2、用office word將模板word另存…

Java中如何使用非阻塞異步編程——CompletableFuture

分享一波:程序員賺外快-必看的巔峰干貨 對于Node開發者來說,非阻塞異步編程是他們引以為傲的地方。而在JDK8中,也引入了非阻塞異步編程的概念。所謂非阻塞異步編程,就是一種不需要等待返回結果的多線程的回調方法的封裝。使用非阻塞異步編程…

城市運行一網統管_【宣傳活動】持續開展城市運行“一網統管”建設宣傳活動...

為進一步推進本鎮城市運行“一網統管”建設工作,提高城市治理能力和治理水平,提升社會各界的知曉度和參與度,激發職能部門人員、黨員、群眾參與“一網統管”工作的熱情。9月10日,鎮網格中心于福泉居委會議室開展“推進城市運行‘一…

Java如何只使用位運算實現加減乘除

分享一波:程序員賺外快-必看的巔峰干貨 前言 接前面一篇博客,這又是某個公司的奇葩面試題(都說了到底是哪家公司才會出這種沒營養的面試題)。不過吐槽歸吐槽,這個題目還是有點學問的,比前面那個 不使用比較運算符如何…

Netweaver里某個software component和C4C的版本

有同事問如何通過代碼的方式獲得Netweaver里某個Software component的版本信息,以及Cloud for Customer(C4C)的版本信息。 Netweaver 點了Detail按鈕后: 這些版本信息存在表CVERS里: C4C C4C的版本號在Help->About …

pmc訂單表格_復工了,讀一則“如何提升訂單準交率和生產效率”的真實故事

故事發生在中國南方小鎮上一個做辦公家具的公司……家具公司創建于1995年,是一家集研發、生產、銷售、服務為一體的現代辦公家具、酒店家具制造企業。主要產品有實木班臺系列、會議臺系列、職員桌系列、屏風系列、沙發系列、辦公座椅、酒店家具系列。在省外還有兩個…

GET和POST請求到底有什么區別?

分享一波:程序員賺外快-必看的巔峰干貨 看到這個標題,想必大部分人都已經想關掉這篇博客了。先別急,你真的知道這兩個的區別嗎? 做過WEB開發的朋友可能很熟悉,看到這個問題能立馬脫口而出二者的區別。 GET在瀏覽器回退時是無害的…

有贊電商云應用框架設計

背景 有贊是 SaaS 公司,向商家提供了全方位的軟件服務,支撐商家進行采購、店鋪、商品、營銷、訂單、物流等等管理服務。 在這個軟件服務里,能夠滿足大部分的商家,為商家保駕護航。 但是很多大商家往往會有自己的特殊需求&#xff…

vivado 如何創建工程模式_基于Vivado的FPGA高性能開發研修班2019年8月30日上海舉行...

一、課程介紹:從7系列FPGA開始,Xilinx提出了Vivado Design Suite設計軟件,提供全新構建的SoC 增強型、以 IP 和系統為中心的下一代開發環境,以解決系統級集成和實現的生產力瓶頸。同時,Xilinx專門針對Vivado推出了Ultr…

程序員的自我修養——遠離“外包思維”

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 在我們做開發的日子里,不免會進行跳槽,跳來跳去公司無非就分成兩大類——互聯網公司、外包公司。當然我們本次討論的并…

英特爾為 Kubernetes 推出分布式深度學習平臺:Nauta

2019獨角獸企業重金招聘Python工程師標準>>> 隨著人工智能的發展,深度學習的價值不斷增長,但實現它可能是一個復雜耗時的過程。英特爾(Intel)正尋求通過其在 Kubernetes 進行分布式深度學習的新開源平臺來改變這一狀況,該深度學習…

pytorch梯度下降函數_Pytorch中常用的四種優化器SGD、Momentum、RMSProp、Adam

來源:AINLPer微信公眾號編輯: ShuYini校稿: ShuYini時間: 2019-8-16 引言很多人在使用pytorch的時候都會遇到優化器選擇的問題,今天就給大家介紹對比一下pytorch中常用的四種優化器。SGD、Momentum、RMSProp、Adam。隨機梯度下降法(SGD&#…

2019/02/11-分布式數據庫概述

分布式數據庫類型(1)同構同質型:各場地都是同一種類型的數據庫,如都是關系型數據庫,且都是同一型號的數據庫管理系統(2)同構異質型:各場地是同一種類型的數據庫,但是數據…

python計算無窮級數求和常用公式_傅里葉變換(二) 從傅里葉級數到傅里葉變換...

在上一部分當中,得到了利用三角函數表示周期函數的方法,但是對于非周期函數就...涼了。所以有什么辦法嗎?沒辦法(劃掉)。這時候我們就需要拿出來我們的黑科技——傅里葉變換。一、傅里葉級數的推廣當然這東西肯定不是憑…

中鳴投籃機器人怎么組裝_1000余人參加洛陽市青少年機器人競賽

機器人智能識別地面上的黑色線條,并沿著線條來到指定位置,放下“快遞包裹”;無人機在空中飛舞,時而鉆過圓環,時而來個空翻,猶如跳芭蕾般在空中劃過一道優美曲線;橘紅色乒乓球從筒道中送出&#…

Exchange隊列優先級介紹和配置

一、場景 在日常辦公環境中所有郵件都會存在重要與非重要的情況,并且不同的郵箱的使用人的級別也不一樣,不一樣的職位級別要求不一樣的運維等級,以及發送郵件要求的速度也不一樣。這就導致了郵件需要按照重要性進行分類,重要的郵件…

Mybatis源碼閱讀(一):Mybatis初始化1.3 —— 解析sql片段和sql節點

*************************************優雅的分割線 ********************************** 分享一波:程序員賺外快-必看的巔峰干貨 如果以上內容對你覺得有用,并想獲取更多的賺錢方式和免費的技術教程 請關注微信公眾號:HB荷包 一個能讓你學習技術和賺錢方法的公眾號,持續更…

IBM研究院計畫5年改變人類生活創新預測

IBM研究院近日發布未來5年將會改變人類生活方式的5項創新預測(IBM 5 in 5),包含透過數字分身(Digital Twin)農業將用更少的資源供給不斷增長的人口、區塊鏈能防范更多的食物浪費、用微生物基因組群保護人類受到有害細菌…

添加請求頭 retrofit_RxJava 與 Retrofit 結合的最佳實踐

前言RxJava和Retrofit也火了一段時間了,不過最近一直在學習ReactNative和Node相關的姿勢,一直沒有時間研究這些新東西,最近有個項目準備寫,打算先用Android寫一個Demo出來,卻發現Android的世界發生了天翻地覆的變化&am…