除了redis,還可使用另一個神器----Celery。Celery是一個異步任務的調度工具。html
Celery是Distributed Task Queue,分佈式任務隊列,分佈式決定了能夠有多個worker的存在,列表表示其是異步操做,即存在一個產生任務提出需求的工頭,和一羣等着被分配工做的碼農。python
在python中定義Celery的時候,咱們要引入Broker,中文翻譯過來就是"中間人"的意思,在這裏Broker起到一箇中間人的角色,在工頭提出任務的時候,把全部的任務放到Broker裏面,在Broker的另外一頭,一羣碼農等着取出一個個任務準備着手作。redis
這種模式註定了整個系統會是個開環系統,工頭對於碼農們把任務作的怎樣是不知情的,因此咱們要引入Backend來保存每次任務的結果。這個Backend有點像咱們的Broker,也是存儲信息用的,只不過這裏存的是那些任務的返回結果。咱們能夠選擇只讓錯誤執行的任務返回結果到Backend,這樣咱們取回結果,即可以知道有多少任務執行失敗了。mongodb
Celery 介紹數據庫
在Celery中幾個基本的概念,須要先了解下,否則不知道爲何要安裝下面的東西。概念:Broker,Backend。ubuntu
Broker:緩存
broker是一個消息傳輸的中間件,能夠理解爲一個郵箱。每當應用程序調用celery的異步任務的時候,會向broker傳遞消息,然後celery的worker將會取到消息,進行程序執行,好吧,這個郵箱能夠當作是一個消息隊列,其中Broker的中文意思是經紀人,其實就是一開始說的消息隊列,用來發送和接受信息。這個broker有幾個方案可供選擇:RabbitMQ(消息隊列),Redis(緩存數據庫),數據庫(不推薦),等等架構
什麼是backend?併發
一般程序發送的消息,發完就完了,可能都不知道對方何時接受了,爲此,celery實現了一個backend,用於存儲這些消息以及celery執行的一些消息和結果,Backend是在Celery的配置中的一個配置項CELERY_RESULT_BACKEND,做用是保存結果和狀態,若是你須要跟蹤任務的狀態,那麼須要設置這一項,能夠是Database backend,也能夠是Cache backend.app
對於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