2012-04-04 12 views
11

Avevo bisogno di inviare posta dalla mia app Flask, quindi ho pensato che il modo più semplice sarebbe di inviarlo usando smtplib. Ma dovevo farlo in modo asincrono - non puoi inserire solo un ritardo di 3 secondi nella richiesta - giusto? Quindi aggiungo l'e-mail a una coda (tabella psql) e la invio da un altro programma che legge questa tabella e usa smptlib.Qual è il modo corretto di eseguire codice Python in modo asincrono?

Questo secondo programma (maildonkey) è in esecuzione come processo separato, in un servizio indipendente di avvio.

Ora ho bisogno di un altro di quei piccoli servizi asinconici, e sto pensando se dovrei scrivere un altro script python (in terzo luogo, contando la mia app Flask e 'maildonkey') o dovrei usare qualcosa come 'multiprocesso' di Python, o anche "discussioni" e riscrivere il secondo programma?

(quando ero programmazione in Clojure, ho potuto facilmente eseguire codice in un thread separato con 'futuro', così normalmente dovrei farlo.)

+0

è il necessario in grassetto? – Blender

risposta

9

Si dovrebbe considerare l'utilizzo di Celery. È ampiamente utilizzato nei framework Web per l'elaborazione asincrona e supporta molti backend diversi come AMQP, database, ecc.

+1

Grazie, ma penso che sarebbe eccessivo per cose così semplici - ho già un sistema funzionante e l'introduzione di un nuovo componente aumenterebbe la sua complessità - vedi http://teddziuba.com/2011/02/the-case-against -queues.html. Mi interessa risolverlo e semplificarlo allo stesso tempo. – Hugo

10

Provare Gevent.
È possibile creare un oggetto Greenlet per l'attività lunga.
Questo verdetto è 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]) 

Inoltre è possibile utilizzare Gevent come server per Flask:

from gevent.wsgi import WSGIServer 
from yourapplication import app 

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