Celery學習筆記(一)

2021-08-11 10:09:51 字數 1434 閱讀 4422

在學習celery之前,我先簡單的去了解了一下什麼是生產者消費者模式。

在實際的軟體開發過程中,經常會碰到如下場景:某個模組負責產生資料,這些資料由另乙個模組來負責處理(此處的模組是廣義的,可以是類、函式、執行緒、程序等)。產生資料的模組,就形象地稱為生產者;而處理資料的模組,就稱為消費者。

單單抽象出生產者和消費者,還夠不上是生產者消費者模式。該模式還需要有乙個緩衝區處於生產者和消費者之間,作為乙個中介。生產者把資料放入緩衝區,而消費者從緩衝區取出資料,如下圖所示:

生產者消費者模式是通過乙個容器來解決生產者和消費者的強耦合問題。生產者和消費者彼此之間不直接通訊,而通過訊息佇列(緩衝區)來進行通訊,所以生產者生產完資料之後不用等待消費者處理,直接扔給訊息佇列,消費者不找生產者要資料,而是直接從訊息佇列裡取,訊息佇列就相當於乙個緩衝區,平衡了生產者和消費者的處理能力。這個訊息佇列就是用來給生產者和消費者解耦的。————->這裡又有乙個問題,什麼叫做解耦?

假設生產者和消費者分別是兩個類。如果讓生產者直接呼叫消費者的某個方法,那麼生產者對於消費者就會產生依賴(也就是耦合)。將來如果消費者的**發生變化,可能會影響到生產者。而如果兩者都依賴於某個緩衝區,兩者之間不直接依賴,耦合也就相應降低了。生產者直接呼叫消費者的某個方法,還有另乙個弊端。由於函式呼叫是同步的(或者叫阻塞的),在消費者的方法沒有返回之前,生產者只好一直等在那邊。萬一消費者處理資料很慢,生產者就會白白糟蹋大好時光。緩衝區還有另乙個好處。如果製造資料的速度時快時慢,緩衝區的好處就體現出來了。當資料製造快的時候,消費者來不及處理,未處理的資料可以暫時存在緩衝區中。等生產者的製造速度慢下來,消費者再慢慢處理掉。

因為太抽象,看過網上的說明之後,通過我的理解,我舉了個例子:吃包子。

假如你非常喜歡吃包子(吃起來根本停不下來),今天,你媽媽(生產者)在蒸包子,廚房有張桌子(緩衝區),你媽媽將蒸熟的包子盛在盤子(訊息)裡,然後放到桌子上,你正在看巴西奧運會,看到蒸熟的包子放在廚房桌子上的盤子裡,你就把盤子取走,一邊吃包子一邊看奧運。在這個過程中,你和你媽媽使用同乙個桌子放置盤子和取走盤子,這裡桌子就是乙個共享物件。生產者新增食物,消費者取走食物。桌子的好處是,你媽媽不用直接把盤子給你,只是負責把包子裝在盤子裡放到桌子上,如果桌子滿了,就不再放了,等待。而且生產者還有其他事情要做,消費者吃包子比較慢,生產者不能一直等消費者吃完包子把盤子放回去再去生產,因為吃包子的人有很多,如果這期間你好朋友來了,和你一起吃包子,生產者不用關注是哪個消費者去桌子上拿盤子,而消費者只去關注桌子上有沒有放盤子,如果有,就端過來吃盤子中的包子,沒有的話就等待。對應關係如下圖:

考察了一下,原來當初設計這個模式,主要就是用來處理併發問題的,而celery就是乙個用python寫的並行分布式框架。

celery學習筆記

ubuntu系統下安裝指令 安裝rabbitmq sudo apt get install rabbitmq server 安裝celery sudo easy install celery 注意 這裡我開始採用官方文件的指令 pip install celery不過發現用不了,執行後面的指令提示不...

celery學習筆記

1.windows下 啟動redis命令 redis server redis.windows.conf 如果出現 5512 23 dec 16 53 14.121 creating server tcp listening socket 127.0.0.1 6379 bind no error 這...

celery 學習筆記(二)

從圖上我們可以看出celery包含幾個模組 主要包括非同步任務和定時任務,非同步任務通常在業務邏輯中被觸發併發送到任務佇列中,而定時任務是由celery beat程序週期性的將任務發往任務佇列。broker就是任務排程佇列,接收任務生產者傳送過來的訊息,將任務存入佇列,之所以需要中間人的原因是cel...