Flask發QQ郵件太慢了(即使是異步),原本150ms響應的頁面加了郵件變成了5s,請問各位大神有沒有比較簡單的解決方法?現在我很疑惑的是,既然我已經新開一個線程來發郵件,按理視圖業務不會等待他發送完郵件而會直接繼續響應,但是實際情況是視圖業務被阻塞了5s部分代碼(按照狗書寫的):def send_async_email(app, msg):
with app.app_context():
mail.send(msg)def send_email(to, subject, template, **kwargs):
app = current_app._get_current_object()
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)
thr = Thread(target=send_async_email, args=[app, msg])
thr.start() return thr
2 回答

泛舟湖上清波郎朗
TA貢獻1818條經驗 獲得超3個贊
不是特別了解flask
,也沒太看懂你寫的啥,但有一點,你異步發郵件也會從150ms變成5s?這里大有問題,應該只有三種可能會這樣
等待網絡I/O的部分根本沒有放到異步任務里(你可能把無關緊要的部分當成耗時的I/O部分放到異步任務里了)
開的新線程用到的變量有鎖,直到郵件發送完才釋放,而處理請求的線程在處理完請求前一直在等待發郵件的線程釋放鎖(或者是處理請求的線程自身的機制導致阻塞,也可能是你在請求處理結束前主動調用了
.join
導致阻塞)在你的場景里,發送郵件是CPU密集型任務,這多出來的4秒多全花在CPU拼命運算如何發郵件上
第三種不太可能,你多加幾行輸出,排查一下前兩種可能
添加回答
舉報
0/150
提交
取消