2012-04-04 11 views
11

Necesitaba enviar correo desde mi aplicación Flask simple, así que pensé que la forma más simple sería enviarlo usando smtplib. Pero tuve que hacerlo de forma asíncrona, no se puede insertar un retraso de 3 segundos en la solicitud, ¿no? Así que agrego el correo electrónico a una cola (tabla psql) y lo envío desde otro programa que lee esta tabla y usa smptlib.¿Cuál es la forma correcta de ejecutar código Python de forma asincrónica?

Este segundo programa (maildonkey) se ejecuta como un proceso separado, en un servicio upstart independiente.

Ahora necesito otro de esos pequeños servicios asincrónicos, y estoy pensando si debería escribir otro script de python (tercero, contar mi aplicación Flask y 'maildonkey') o debería usar algo como 'multiproceso' de Python, o incluso 'hilos' y reescribir el segundo programa?

(Cuando estaba programando en Clojure, que fácilmente podría ejecutar código en un hilo separado con los futuros '', por lo que normalmente lo haría.)

+0

¿Está la negrita es necesario? – Blender

Respuesta

9

Debe considerar el uso Celery. Es muy utilizado en frameworks web para procesamiento asincrónico y es compatible con muchos backends diferentes como AMQP, bases de datos, etc.

+1

Gracias, pero creo que esto sería excesivo para cosas tan simples: ya tengo un sistema en funcionamiento y la introducción de un nuevo componente solo aumentaría su complejidad. Consulte http://teddziuba.com/2011/02/the-case-against -queues.html. Me interesa resolverlo Y simplificarlo al mismo tiempo. – Hugo

10

Pruebe Gevent.
Puede crear objetos Greenlet para su tarea larga.
Este verde es 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]) 

También se puede utilizar como un GEvent server para Frasco:

from gevent.wsgi import WSGIServer 
from yourapplication import app 

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