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

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
阅读 4.1k
2 个回答

已解决问题,速度慢是因为Message初始化,只要把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

详情见我的博客

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

  1. 等待网络I/O的部分根本没有放到异步任务里(你可能把无关紧要的部分当成耗时的I/O部分放到异步任务里了)
  2. 开的新线程用到的变量有锁,直到邮件发送完才释放,而处理请求的线程在处理完请求前一直在等待发邮件的线程释放锁(或者是处理请求的线程自身的机制导致阻塞,也可能是你在请求处理结束前主动调用了.join导致阻塞)
  3. 在你的场景里,发送邮件是CPU密集型任务,这多出来的4秒多全花在CPU拼命运算如何发邮件上

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

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题