1. 程式人生 > >python--celery

python--celery

有些時候我們的一些任務比較耗時,比如我們寫了一個網站,使用者註冊的時候需要傳送郵件。但是傳送郵件的過程比較耗時,使用者必須要等到我們將郵件傳送成功之後才會得到響應。那麼有沒有一種辦法,當用戶點擊發送郵件的時候,我們立即返回郵件已經發送成功呢?不需要等到郵件傳送成功之後再返回,而是傳送的同時就返回。

答案是可以的,可以使用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原碼有問題,在下一個版本應該會修復