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

Hug*_*ugo 11 python upstart flask

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

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

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

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

Pra*_*ota 10

你应该考虑使用芹菜.它在Web框架中被广泛用于异步处理,并支持许多不同的后端,如AMQP,数据库等.

  • 谢谢,但我认为这对于这些简单的事情来说太过分了 - 我已经有了一个工作系统并且引入一个新组件只会增加其复杂性 - 请参阅http://teddziuba.com/2011/02/the-case-against- queues.html.我有兴趣解决它并同时简化它. (2认同)

Sta*_*tan 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])
Run Code Online (Sandbox Code Playgroud)

您也可以使用Gevent作为Flask 的服务器:

from gevent.wsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()
Run Code Online (Sandbox Code Playgroud)