Flask-mail 发邮件慢(即使异步)
Flask-mail 发邮件慢(即使异步)
一开始,按照狗书上的代码异步发邮件,但是发现原本响应只需要150ms的页面加了邮件发送就变成了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])
print datetime.datetime.now().second
msg.body = render_template(template + '.txt', **kwargs)
msg.html = render_template(template + '.html', **kwargs)
print datetime.datetime.now().second
thr = Thread(target=send_async_email, args=[app, msg])
thr.start()
print datetime.datetime.now().second
return thr
之后我在每一个可能延时的位置加了一句print datetime.datetime.now().second
,最后发现,真正拖时间的地方居然是在Message
初始化的时候!
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
于是自己优化了一下发邮件的代码,把Message
初始化的部分也放进了异步线程中。
优化后,速度明显提升:)
我的优化代码:
def send_async_email(app, to, subject, template_done_html, template_done_txt):
with app.app_context():
msg = Message(app.config['FLASKY_MAIL_SUBJECT_PREFIX'] + subject,
sender=app.config['FLASKY_MAIL_SENDER'], recipients=[to])
msg.body = template_done_txt
msg.html = template_done_html
mail.send(msg)
def send_email(to, subject, template, **kwargs):
app = current_app._get_current_object()
template_done_html = render_template(template + '.html', **kwargs)
template_done_txt = render_template(template + '.txt', **kwargs)
thr = Thread(target=send_async_email, args=[app, to, subject, template_done_html, template_done_txt])
thr.start()
return thr