我需要从我的普通Flask应用程序发送邮件,所以我认为最简单的方法是使用smtplib发送它。但我不得不异步地做 - 你不能只在请求中插入3秒的延迟 - 对吗?所以我将电子邮件添加到队列(psql表),并从另一个读取此表的程序发送它并使用smptlib。
第二个程序(maildonkey)作为一个单独的进程在一个独立的upstart服务中运行。
现在我需要另一个这样的小异步服务,我在想是否应该编写另一个python脚本(第三,计算我的Flask应用程序和'maildonkey')或者我应该使用类似Python的'multiprocess',或者甚至'线程'并重写第二个程序?
(当我在Clojure中编程时,我可以轻松地在'future'的单独线程中运行代码,所以通常我会这样做。)
答案 0 :(得分:10)
您应该考虑使用Celery。它在Web框架中被广泛用于异步处理,并支持许多不同的后端,如AMQP,数据库等。
答案 1 :(得分:10)
试试Gevent 您可以为长期任务创建Greenlet对象 此greenlet为green thread。
from gevent import monkey
monkey.patch_all()
import gevent
from gevent import Greenlet
class Task(Greenlet):
def __init__(self, name):
Greenlet.__init__(self)
self.name = name
def _run(self):
print "Task %s: some task..." % self.name
t1 = Task("long task")
t1.start()
# here we are waiting task
gevent.joinall([t1])
你也可以将Gevent用作Flask的server:
from gevent.wsgi import WSGIServer
from yourapplication import app
http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()