11

我需要从我的普通 Flask 应用程序发送邮件,所以我认为最简单的方法是使用 smtplib 发送邮件。但我必须异步执行 - 你不能只在请求中插入 3 秒延迟 - 对吧?因此,我将电子邮件添加到队列(psql 表)中,然后从另一个读取该表并使用 smptlib 的程序发送它。

第二个程序(maildonkey)作为一个独立的进程在一个独立的 upstart 服务中运行。

现在我需要另一个小的异步服务,我正在考虑是否应该编写另一个 python 脚本(第三个,计算我的 Flask 应用程序和“maildonkey”)或者我应该使用 Python 的“多进程”甚至“线程”之类的东西' 并重写第二个程序?

(当我在 Clojure 中编程时,我可以很容易地使用“futures”在单独的线程中运行代码,所以通常我会这样做。)

4

2 回答 2

10

您应该考虑使用Celery。它在 Web 框架中非常广泛地用于异步处理,并支持许多不同的后端,如 AMQP、数据库等。

于 2012-04-04T01:46:18.213 回答
10

试试Gevent
您可以为您的长期任务创建 Greenlet 对象。
这个greenlet是绿色线程

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 的服务器

from gevent.wsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
于 2012-04-04T02:29:19.520 回答