Python Flask後端非同步處理(二)

2022-01-18 11:18:51 字數 3244 閱讀 7753

在實際的應用場景中,如使用者註冊,使用者輸入了註冊資訊後,後端儲存資訊到資料庫中,然後跳轉至登入介面,這些操作使用者需要等待的時間非常短,但是如果是有耗時任務,比如對輸入的**進行漏洞掃瞄,在後端處理就會花費幾分鐘的時間,不可能讓使用者等待頁面重新整理幾分鐘,所以需要進行後端非同步處理。之前使用的後端非同步處理時python的原生執行緒/程序實現,簡潔暴力,自己用的話還行,但是如果是給使用者用,就還存在一些不足,現考慮使用celery替換掉原生執行緒/程序非同步處理。

celery

celery是個python語言實現的非同步分布式任務佇列服務,除了支援即時任務,還支援定時任務,celery有五個核心角色。

接下來編寫乙個簡單的python程式來學習使用celery

pip3installcelery==3.1.24

建立celery例項

# task.py

from celery import celery

​建立任務

#task.py

def send_mail(email):

print("send mail to ", email)

import time

time.sleep(5)

return "success"

啟動worker

啟動worker,監聽broker中是否有任務

celery worker

可以帶引數如

celery -a task worker --loglevel=info

-a: 指定 celery 例項所在哪個模組中,--loglevel:顯示日誌等級

執行後如下

呼叫任務

在主程式中呼叫任務,調任務傳送給broker,跟開乙個多執行緒和多程序類似,相當於是把任務丟給了broker,主程式繼續向下執行。

from task import send_mail

​def register():

import time

start = time.time()

print("1. 插入記錄到資料庫")

print("2. celery 幫我發郵件")

send_mail.delay("[email protected]")

print("3. 告訴使用者註冊成功")

print("耗時:%s 秒 " % (time.time() - start))

​if __name__ == '__main__':

register()

目錄結構為:

── celery測試

├── task.py

└── user.py

執行user.py,檢視執行結果為:

可知

time.sleep(5)
被丟到後台去執行了,所以花費時間這麼短。如果按照正常的同步邏輯去實現,至少需要5秒鐘的時間,因為存在time.sleep(5)來模擬傳送郵件。

在worker服務視窗檢視日誌資訊

跟著大佬們的部落格學習了celery的基本操作,大部分時間去安裝環境了,淦

請聽下回分解 咕咕咕

安裝出現的錯誤

參考自:

這個是python3.7目前不支援kombu,降低python版本至3.6即可,(又得重新裝一波python,沒裝conda嗚嗚嗚,解除安裝之前先把python的類庫輸出到requirements.txt檔案

關於解除安裝python,可以參考這篇部落格:

如果電腦上是python2和python3共存,請看:

弄好了之後再把之前python3.7的庫檔案恢復到python3.6裡面來

pip3 install -r requirements.txt

弄好了之後重新開啟python的整合開發環境

可算能執行celery了

接著執行程式的時候又遇到了

attributeerror: 'str' object has no attribute 'items'

出現該問題的原因是redis版本過高,降低redis版本即可

pip3 install redis==2.10.6

然後就沒有遇到其他的坑了,遇到再補:d

參考鏈結

Python Flask後端非同步處理(三)

前一篇博文我們已經將基礎知識和環境配置進行了介紹 本篇博文在實際應用場景中使用celery,對flask後端進行非同步處理。首先編寫乙個celerytask.py檔案進行celery的配置,同時耗時任務也寫在該檔案中 from celery import celery from szheconsol...

後端學習 Python Flask

python3 flask.session 第一次訪問網頁需要登入,之後一定時間內不需要登入 首先引入session模組 from flask import session設定乙個用於session加密的金鑰 11 主頁處理函式 defwelcome session.permanent true 設...

Python Flask非同步傳送郵件實現方法解析

第一步,修改工廠函式,配置郵件引數 from flask import flask from config import config from flask sqlalchemy import sqlalchemy from flask mail import mail db sqlalchemy ...