Celery詳解


  除了redis,還可以使用另外一個神器----Celery。Celery是一個異步任務的調度工具。

  Celery是Distributed Task Queue,分布式任務隊列,分布式決定了可以有多個worker的存在,列表表示其是異步操作,即存在一個產生任務提出需求的工頭,和一群等着被分配工作的碼農。

  在python中定義Celery的時候,我們要引入Broker,中文翻譯過來就是"中間人"的意思,在這里Broker起到一個中間人的角色,在工頭提出任務的時候,把所有的任務放到Broker里面,在Broker的另一頭,一群碼農等着取出一個個任務准備着手做。

  這種模式注定了整個系統會是個開環系統,工頭對於碼農們把任務做的怎樣是不知情的,所以我們要引入Backend來保存每次任務的結果。這個Backend有點像我們的Broker,也是存儲信息用的,只不過這里存的是那些任務的返回結果。我們可以選擇只讓錯誤執行的任務返回結果到Backend,這樣我們取回結果,便可以知道有多少任務執行失敗了。

Celery 介紹

在Celery中幾個基本的概念,需要先了解下,不然不知道為什么要安裝下面的東西。概念:Broker,Backend。

Broker:

  broker是一個消息傳輸的中間件,可以理解為一個郵箱。每當應用程序調用celery的異步任務的時候,會向broker傳遞消息,而后celery的worker將會取到消息,進行程序執行,好吧,這個郵箱可以看成是一個消息隊列,其中Broker的中文意思是經紀人,其實就是一開始說的消息隊列,用來發送和接受信息。這個broker有幾個方案可供選擇:RabbitMQ(消息隊列),Redis(緩存數據庫),數據庫(不推薦),等等

什么是backend?

  通常程序發送的消息,發完就完了,可能都不知道對方什么時候接受了,為此,celery實現了一個backend,用於存儲這些消息以及celery執行的一些消息和結果,Backend是在Celery的配置中的一個配置項CELERY_RESULT_BACKEND,作用是保存結果和狀態,如果你需要跟蹤任務的狀態,那么需要設置這一項,可以是Database backend,也可以是Cache backend.

對於brokers,官方推薦是rabbitmq和redis,至於backend,就是數據庫,為了簡單可以都使用redis。

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

消息中間件

Celery本身不提供消息服務,但是可以方便的和第三方提供的消息中間件集成,包括,RabbitMQ,Redis,MongoDB..............

任務執行單元

Worker是celery提供的任務執行的單元,worker並發的運行在分布式的系統節點中。

任務結果存儲

Task result store用來存儲Worker執行的任務的結果,Celery支持以不同方式存儲任務的結果,包括AMQP,redis,memcached,mongodb,SQLAlchemy,Django

安裝Redis,它的安裝比較簡單:

然后進行配置,一般都在項目的config.py文件里配置:

URL的格式為:

redis://:password@hostname:port/db_number

URL Scheme后的所有字段都是可選的,並且默認為localhost的6479端口,使用數據庫0。我的配置是:

redis://:password@ubuntu:6379/5

安裝Celery,我是用標准的Python工具pip安裝的,如下:

使用Celery

使用celery包含三個方面:1,定義任務函數  2,運行celery服務   3,客戶應用程序的調用

創建一個文件tasks.py輸入下列代碼:

上述代碼導入了celery,然后創建了celery實例app,實例化的過程中指定了任務名tasks(和文件名一致),傳入了broker和backend。然后創建了一個任務函數add。下面啟動

celery服務,在當前命令行終端運行:

目錄結構(celery -A tasks worker --loglevel=info這條命令當前工作目錄必須和tasks.py所在的目錄相同,即進入tasks.py所在目錄執行這條命令)

調用delay函數即可啟動add這個任務,這個函數的效果是發送一條消息到broker中去,這個消息包括要執行的函數,函數的參數以及其他消息,具體的可以看Celery官方文檔。這個時候worker會等待broker中的消息,一旦收到消息就會立刻執行消息。

注意:如果把返回值賦值給一個變量,那么原來的應用程序也會被阻塞,需要等待異步任務返回的結果,因此,實際使用中,不需要把結果賦值。

使用配置文件

Celery的配置比較多,可以在官方配置文檔:http://docs.celeryproject.org/en/latest/userguide/configuration.html 查詢每個配置項的含義。

上述的使用是簡單的配置,下面介紹一個更健壯的方式來使用celery。首先創建一個python包,celery服務,姑且命名為proj。目錄文件如下:

首先是celery.py

這一次創建app,並沒有直接指定broker和backend。而是在配置文件中。

config.py

剩下的就是tasks.py

使用方法也很簡單,在proj的同一級目錄執行celery:

celery -A proj worker -l info

現在使用任務也很簡單,直接在客戶端代碼調用proj.tasks里的函數即可。

Scheduler(定時任務,周期性任務)

一種常見的需求是每隔一段時間執行一個任務

在celery中執行定時任務非常簡單,只需要設置celery對象的CELERYBEAT_SCHEDULE屬性即可。

配置如下

config.py

注意配置文件需要指定時區,這段代碼表示每隔30秒執行add函數,一旦使用了scheduler,啟動celery需要加上-B參數。

celery -A proj worker -B -l info

參考鏈接:https://blog.csdn.net/freeking101/article/details/74707619

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM