在 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 的轻量级替代品,我发现它更容易起床 运行。我过去用它在后台发送电子邮件,它没有让我失望。
我尝试解决 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 的轻量级替代品,我发现它更容易起床 运行。我过去用它在后台发送电子邮件,它没有让我失望。