我尝试解决在web.py项目中发送邮件(或任何长任务)的问题。我想要的是开始发送任何邮件并返回http响应。但是这项任务(发送)需要很长时间。有什么解决方案吗?
示例:
import web
''some settings urls, etc.''
class Index:
def GET(self):
''task''
sending_mail()
return 'response'
我找到了很多关于异步任务的例子,但我认为如果将这个任务放到后台并返回“响应”,它将会失败。
答案 0 :(得分:3)
您可以通过单独的线程发送电子邮件(您可以在需要发送电子邮件时生成电子邮件):
import threading
threading.Thread(target=sending_email).start()
但是,全面的最佳(和标准)解决方案是使用异步任务处理器,例如Celery。在您的Web线程中,只需创建一个新任务,Celery将异步执行它。
没有理由"返回响应"使用消息队列时会失败,除非您的响应取决于发送响应之前发送的电子邮件(但在这种情况下,您遇到了架构问题)。
答案 1 :(得分:0)
将sending_email()
任务移至后台队列将是最佳解决方案。这将允许您立即返回响应并稍后获取sending_email
任务的结果。
我还建议你看看RQ 它是Celery的轻量级替代品,我发现它更容易启动和运行。我过去曾用它在后台发送电子邮件,并没有让人失望。