在web.py中发送邮件异步

时间:2015-01-28 20:34:45

标签: python email asynchronous web.py

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

示例:

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

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

我找到了很多关于异步任务的例子,但我认为如果将这个任务放到后台并返回“响应”,它将会失败。

2 个答案:

答案 0 :(得分:3)

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

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

但是,全面的最佳(和标准)解决方案是使用异步任务处理器,例如Celery。在您的Web线程中,只需创建一个新任务,Celery将异步执行它。


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

答案 1 :(得分:0)

sending_email()任务移至后台队列将是最佳解决方案。这将允许您立即返回响应并稍后获取sending_email任务的结果。

我还建议你看看RQ 它是Celery的轻量级替代品,我发现它更容易启动和运行。我过去曾用它在后台发送电子邮件,并没有让人失望。