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

问题描述:

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

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

现在我需要另一个小的异步服务,我想如果我应该写另一个python脚本(第三,计算我的Flask应用程序和'maildonkey')还是应该使用像Python的'多进程'之类的东西,甚至'线程'并重写第二个程序?

(当我用Clojure是编程,我可以很容易地运行与“期货”一个单独的线程代码,所以通常我会做到这一点。)

+0

是大胆的必要吗? – Blender 2012-04-04 01:51:44

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

+1

谢谢,但我认为这对于如此简单的事情来说是过分的 - 我已经有一个工作系统,并且引入一个新组件会增加其复杂性 - 请参见http://teddziuba.com/2011/02/the-case-against -queues.html。我有兴趣解决它,并在同一时间简化它。 – Hugo 2012-04-04 14:56:37

尝试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作为server对瓶:

from gevent.wsgi import WSGIServer 
from yourapplication import app 

http_server = WSGIServer(('', 5000), app) 
http_server.serve_forever()