python之celery非同步處理

2022-09-23 03:02:08 字數 2259 閱讀 2680

在寫個人部落格專案的時候,涉及到郵件驗證碼和簡訊驗證碼的傳送的功能,應該非同步地去執行,而不是同步形成阻塞。這時就要用到python的擴充套件庫celery。

celery是一個強大的分散式任務佇列的非同步處理元件,它可以讓任務的執行完全脫離主程式,甚至可以被分配到其他主機上執行。

celery的架構由三部分組成,訊息中介軟體(message broker),任務執行單元(worker)和任務執行結果儲存(task result store)組成。

訊息中介軟體:

celery本身不提供訊息服務,但是可以方便的和第三方提供的訊息中介軟體整合。包括,rabbitmq, redis等等

任務執行單元:

worker是celery提供的任務執行的單元,worker併發的執行在分散式的系統節點中。

任務結果儲存:

task result store用來儲存worker執行的任務的結果,celery支援以不同方式儲存任務的結果,包括amqp, redis等

個人理解,有些功能,比如發簡訊通知,是一個耗時任務,如果都扎堆在一起去執行,同步操作一次執行一個,一次發一條簡訊,勢必會形成阻塞。例如美團外賣,中午12點整的下單人數100個,每個人下單完成後系統都要發個簡訊給使用者說“下單成功”,每次發簡訊時間假如是1s,那就要100s發完這100條簡訊,那第101個人下單完成後要等100秒才能收到簡訊,這是什麼使用者體驗?很顯然,我們不能一次發一條簡訊,而應該併發,一次發n條。這些併發技術是比較底層的,寫起來很麻煩,而celery就幫我們封裝好了這些併發技術,我們要做的就是通過celery去調動執行併發。

使用場景:

定時任務:定時執行某件事情,比如每天資料統計

之前在cms後臺修改郵箱的時候點選傳送驗證碼郵件,會有大概1.2s的延時然後彈出傳送成功的對話方塊。這個延時就是呼叫flask擴充套件mail傳送郵件的耗時,這時在同步場景下執行的。現在換成celery的非同步操作:

1

from celery import

celery

2from flask_mail import

message

3from exts import

mail

4from flask import

flask

5import

config)7

910defcelery_result_backend

celery_broker_url'])

1213 taskbase =celery.task

14class

contexttask(taskbase):

15 abstract =true

16def

__call__(self, *args, **kwargs):

1718

return taskbase.__call__(self, *args, **kwargs)

19 celery.task =contexttask

20return

celery

2123

[email protected]

25def

send_mail(subject,recipients,body):

26 message = message(subject=subject,recipients=recipients,body=body)

27 mail.send(message)

之後點選傳送驗證碼就是立即彈出alert了。使用者體驗極佳。

這裡要注意,目前我這個專案執行在window10上,但是celery對windows不太友好,4.x版本後不支援windows,要用eventlet去解決。eventlet是python的併發網路庫。

在命令列開啟:celery -a tasks.celery worker --pool=eventlet --loglevel=info

後來發現一定機率出現莫名的報錯。

將eventlet改為solo就可以了:

celery -a tasks.celery worker --pool=solo --loglevel=info

python celery locust

一 celery任務佇列 二 locustfrom locust import httplocust taskset task core f...

Python之celery的簡介與使用

celery是一個基於分散式訊息傳輸的非同步任務佇列,它專注於實時處理,同時也支援任務排程。它的執行單元為任務 task ,利用多執行緒,如eventlet,gevent等,它們能被併發地執行在單個或多個職程伺服器 worker servers 上。任務能非同步執行 後臺執行 或同步執行 等待任務完成 。...

python celery 非同步學習

1 執行redis 2 安裝celery pip install celery redis 3 vim task py import time from celery import celery broker redis localhost 6379 1 backend redis localhos...