为了账号安全,请及时绑定邮箱和手机立即绑定

Flask发邮件慢(即使是异步)

Flask发邮件慢(即使是异步)

白猪掌柜的 2019-02-07 10:10:32
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贡献1831条经验 获得超9个赞

不是特别了解flask,也没太看懂你写的啥,但有一点,你异步发邮件也会从150ms变成5s?这里大有问题,应该只有三种可能会这样

  1. 等待网络I/O的部分根本没有放到异步任务里(你可能把无关紧要的部分当成耗时的I/O部分放到异步任务里了)

  2. 开的新线程用到的变量有锁,直到邮件发送完才释放,而处理请求的线程在处理完请求前一直在等待发邮件的线程释放锁(或者是处理请求的线程自身的机制导致阻塞,也可能是你在请求处理结束前主动调用了.join导致阻塞)

  3. 在你的场景里,发送邮件是CPU密集型任务,这多出来的4秒多全花在CPU拼命运算如何发邮件上

第三种不太可能,你多加几行输出,排查一下前两种可能


查看完整回答
反对 回复 2019-02-19
  • 2 回答
  • 0 关注
  • 514 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信