2012-04-04 37 views
11

我需要從我的普通Flask應用程序發送郵件,所以我認爲最簡單的方法是使用smtplib發送郵件。但我必須異步執行 - 您不能只在請求中插入3秒的延遲 - 對嗎?因此,我將電子郵件添加到隊列(psql表)中,並從另一個讀取此表並使用smptlib的程序發送它。什麼是異步運行一些Python代碼的正確方法?

第二個程序(maildonkey)作爲一個獨立的進程在獨立的新貴服務中運行。

現在我需要另一個小的異步服務,我想如果我應該寫另一個python腳本(第三,計算我的Flask應用程序和'maildonkey')還是應該使用像Python的'多進程'之類的東西,甚至'線程'並重寫第二個程序?

(當我用Clojure是編程,我可以很容易地運行與「期貨」一個單獨的線程代碼,所以通常我會做到這一點。)

+0

是大膽的必要嗎? – Blender 2012-04-04 01:51:44

回答

9

您應該考慮使用Celery。它非常廣泛地用於異步處理的web框架,並支持許多不同的後端,如AMQP,數據庫等。

+1

謝謝,但我認爲這對於如此簡單的事情來說是過分的 - 我已經有一個工作系統,並且引入一個新組件會增加其複雜性 - 請參見http://teddziuba.com/2011/02/the-case-against -queues.html。我有興趣解決它,並在同一時間簡化它。 – Hugo 2012-04-04 14:56:37

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作爲server對瓶:

from gevent.wsgi import WSGIServer 
from yourapplication import app 

http_server = WSGIServer(('', 5000), app) 
http_server.serve_forever() 
相關問題