天天看點

python celery 學習(一)

學習celery先了解下生産者消費者模式

生産者消費者模式

生産者:

在實際的軟體開發過程中,經常會碰到如下場景:某個子產品負責産生資料,這些資料由另一個子產品來負責處理(此處的子產品是廣義的,可以是類、函數、線程、程序等)。産生資料的子產品,就形象地稱為生産者;

消費者:

而處理資料的子產品,就稱為消費者。

緩沖區:

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

python celery 學習(一)

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

解耦:假設生産者和消費者分别是兩個類。如果讓生産者直接調用消費者的某個方法,那麼生産者對于消費者就會産生依賴(也就是耦合)。将來如果消費者的代碼發生變化,可能會影響到生産者。而如果兩者都依賴于某個緩沖區,兩者之間不直接依賴,耦合也就相應降低了。

生産者直接調用消費者的某個方法,還有另一個弊端。由于函數調用是同步的(或者叫阻塞的),在消費者的方法沒有傳回之前,生産者隻好一直等在那邊。萬一消費者處理資料很慢,生産者就會白白糟蹋大好時光。緩沖區還有另一個好處。如果制造資料的速度時快時慢,緩沖區的好處就展現出來了。當資料制造快的時候,消費者來不及處理,未處理的資料可以暫時存在緩沖區中。等生産者的制造速度慢下來,消費者再慢慢處理掉。

這個模式,主要就是用來處理并發問題的

Celery就是一個用python寫的并行分布式架構。

celery

Celery是一個簡單、靈活且可靠的,處理大量消息的分布式系統,并且提供維護這樣一個系統的必需工具

Celery支援使用任務隊列的方式在分布的機器、程序、線程上執行任務排程。

任務隊列:

任務隊列是一種線上程或機器間分發任務的機制。

任務隊列是一個邏輯上的概念,即将抽象的任務發送到執行的worker的元件,有的時候包含了後端的worker,有的時候不包含,并沒有什麼具體的形式,也沒有什麼規範。

消息隊列:

了解為一個中間件提供一個平台供不同的平台、不同的語言之間的可靠的、持久的異步通信機制

消息隊列的輸入是工作的一個單元,稱為任務,獨立的職程(Worker)程序持續監視隊列中是否有需要處理的新任務。

Celery 用消息通信,通常使用中間人(Broker)在用戶端和職程間斡旋。這個過程從用戶端向隊列添加消息開始,之後中間人把消息派送給職程,職程對消息進行處理。如下圖所示:

python celery 學習(一)

Celery 系統可包含多個職程和中間人,以此獲得高可用性和橫向擴充能力。

Celery的架構

Celery的架構由三部分組成,消息中間件(message broker),任務執行單元(worker)和任務執行結果存儲(task result store)組成。

消息中間件:Celery本身不提供消息服務,但是可以友善的和第三方提供的消息中間件內建,包括,RabbitMQ,Redis,MongoDB等,相當于生産者模式中的緩存曲。

任務執行單元(worker):Worker是Celery提供的任務執行的單元,worker并發的運作在分布式的系統節點中。生産者模式中的消費者

任務結果存儲:Task result store用來存儲Worker執行的任務的結果,Celery支援以不同方式存儲任務的結果,包括Redis,MongoDB,Django ORM,AMQP等,這裡我先不去看它是如何存儲的,就先選用Redis來存儲任務執行結果。
           
架構圖
python celery 學習(一)

可以看到,Celery 主要包含以下幾個子產品:

任務子產品 Task

包含異步任務和定時任務。其中,異步任務通常在業務邏輯中被觸發并發往任務隊列,而定時任務由 Celery Beat 程序周期性地将任務發往任務隊列。

消息中間件 Broker

Broker,即為任務排程隊列,接收任務生産者發來的消息(即任務),将任務存入隊列。Celery 本身不提供隊列服務,官方推薦使用 RabbitMQ 和 Redis 等。

任務執行單元 Worker

Worker 是執行任務的處理單元,它實時監控消息隊列,擷取隊列中排程的任務,并執行它。

任務結果存儲 Backend

Backend 用于存儲任務的執行結果,以供查詢。同消息中間件一樣,存儲也可使用 RabbitMQ, redis 和 MongoDB 等。

轉載:https://blog.csdn.net/freeking101/article/details/74707619