2012-04-04 2 views
11

Мне нужно было отправить почту из моего простого приложения Flask, поэтому я подумал, что самый простой способ - отправить его с помощью smtplib. Но я должен был сделать это асинхронно - вы не можете просто вставить 3-секундную задержку в запрос - правильно? Поэтому я добавляю электронное письмо в очередь (psql table) и отправляю его из другой программы, которая читает эту таблицу и использует smptlib.Каков правильный способ запускать некоторый код Python асинхронно?

Эта вторая программа (maildonkey) работает как отдельный процесс в независимой службе выскочки.

Теперь мне нужна еще одна из этих маленьких асинхронных сервисов, и я думаю, что если я напишу еще один скрипт python (в-третьих, считая мое приложение Flask и «maildonkey»), или я должен использовать что-то вроде «многопроцесса» Python, или даже «потоки» и переписать вторую программу?

(Когда я программировал в Clojure, я мог бы легко запустить код в отдельном потоке с «фьючерсов», так что обычно я хотел бы сделать это.)

+0

Is смелое необходимо? – Blender

ответ

9

Вы должны рассмотреть возможность использования Celery. Он очень широко используется в веб-инфраструктурах для асинхронной обработки и поддерживает множество различных бэкэнд, таких как AMQP, базы данных и т. Д.

+1

Спасибо, но я думаю, что это было бы излишним для таких простых вещей - у меня уже есть рабочая система, и введение нового компонента просто увеличит его сложность - см. Http://teddziuba.com/2011/02/the-case-against -queues.html. Я заинтересован в ее решении и упрощаю его одновременно. – Hugo

10

Попробуйте Gevent.
Вы можете создать объект 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()