异步运行某些Python代码的正确方法是什么?

时间:2012-04-04 01:44:07

标签: python flask upstart

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

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

现在我需要另一个这样的小异步服务,我在想是否应该编写另一个python脚本(第三,计算我的Flask应用程序和'maildonkey')或者我应该使用类似Python的'multiprocess',或者甚至'线程'并重写第二个程序?

(当我在Clojure中编程时,我可以轻松地在'future'的单独线程中运行代码,所以通常我会这样做。)

2 个答案:

答案 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()