在 web.py 中异步发送邮件

Send mails async in web.py

我尝试解决 web.py 项目中发送邮件(或任何长任务)的问题。我想要的是开始发送任何邮件和 return http 响应。但是这个任务(发送)需要很长时间。有什么解决办法吗?

示例:

import web
''some settings urls, etc.''

class Index:
    def GET(self):
        ''task''
        sending_mail()
        return 'response'

我发现了很多关于异步任务的例子,但我认为如果这个任务放在后台并且 return 'response' 它会失败。

您可以在单独的线程中发送电子邮件(您可以在需要发送电子邮件时生成一个线程):

import threading
threading.Thread(target=sending_email).start()

但是,最好的(也是标准的)解决方案是使用异步任务处理器,例如 Celery。在您的网络线程中,只需创建一个新任务,Celery 就会异步执行它。


没有理由 "returning response" 在使用消息队列时会失败,除非您的响应取决于发送响应之前发送的电子邮件(但在那种情况下,您遇到了架构问题)。

sending_email() 任务移动到后台队列将是最好的解决方案。这将允许您立即 return 响应并稍后获得 sending_email 任务的结果。

我也建议看一下 RQ 它是 Celery 的轻量级替代品,我发现它更容易起床 运行。我过去用它在后台发送电子邮件,它没有让我失望。