python--celery
阿新 • • 發佈:2019-01-02
有些時候我們的一些任務比較耗時,比如我們寫了一個網站,使用者註冊的時候需要傳送郵件。但是傳送郵件的過程比較耗時,使用者必須要等到我們將郵件傳送成功之後才會得到響應。那麼有沒有一種辦法,當用戶點擊發送郵件的時候,我們立即返回郵件已經發送成功呢?不需要等到郵件傳送成功之後再返回,而是傳送的同時就返回。
答案是可以的,可以使用celery來實現,celery的架構如下圖所示,celery相當於是一個指揮官,真正幹活的是下面四個元件。
task:我們需要執行的任務
broker:redis,rabbitMQ等訊息佇列,celery會將task扔進broker裡面,進行排隊,統一管理
worker:幹活的人,celery會從broker當中取出task交給worker去執行
backend:儲存任務的執行結果
我們是在windows上進行演示,所以還需要eventlet這個任務排程框架,pip install eventlet即可
''' tasks.py,儲存任務 ''' from celery import Celery import time # main:當前的py檔名 # broker:中間人,比如redis,指定方式redis://:[email protected]:port/db,我們這裡沒有密碼,直接redis://localhost:6379/0即可 # backend:結果儲存的位置 celery = Celery(main="tasks", broker="redis://localhost:6379/0", backend="redis://localhost:6379/0") # 建立任務,模擬傳送郵件。 # 如何變成任務呢?只需要加上一個裝飾器,就變成了一個任務 @celery.task def send_mail(): print("郵件開始傳送。。。。。") time.sleep(3) print("郵件傳送結束。。。。。")
''' main.py,執行任務 ''' from tasks import send_mail import time if __name__ == '__main__': start = time.time() # 這個時候不能直接執行send_mail(),而是要使用delay方法 send_mail.delay() # 我們在tasks.py中定義的send_mail函式中,有time.sleep(5),但是send_mail.delay()是不會管的 # 會瞬間執行完畢 end = time.time() print(end - start)
已經啟動成功了
我們來執行一下main.py,可以瞬間執行,同時在終端會打印出結果。這裡就不再演示了,因為celery原碼有問題,在下一個版本應該會修復