2012-04-04 29 views
11

Potrzebowałem wysłać pocztę z mojej prostej aplikacji Flask, więc pomyślałem, że najprościej będzie wysłać ją za pomocą smtplib. Ale musiałem to zrobić asynchronicznie - nie możesz po prostu wstawić 3-sekundowego opóźnienia do żądania - prawda? Dodaję więc wiadomość e-mail do kolejki (tabela psql) i wysyłam ją z innego programu, który odczytuje tę tabelę i używa smptlib.Jaki jest właściwy sposób na asynchroniczne uruchamianie kodu Python?

Ten drugi program (maildonkey) działa jako oddzielny proces w niezależnej usłudze start-up.

Potrzebuję jeszcze jednej z tych małych asynchoronicznych usług i myślę, że powinienem napisać kolejny skrypt Pythona (trzeci, licząc moją aplikację Flask i "maildonkey"), czy powinienem użyć czegoś takiego jak "wieloprocesor" Pythona, lub nawet "wątki" i przepisać drugi program?

(Kiedy programowania w Clojure, mogę łatwo uruchomić kod w oddzielnym wątku z „futures”, tak normalnie to zrobić.)

+0

jest pogrubiony konieczne? – Blender

Odpowiedz

9

Należy rozważyć użycie Celery. Jest on bardzo szeroko stosowany w architekturach sieciowych do przetwarzania asynchronicznego i obsługuje wiele różnych baz danych, takich jak AMQP, baz danych itp.

+1

Dzięki, ale myślę, że byłoby to przesadą dla tak prostych rzeczy - mam już działający system i wprowadzenie nowego komponentu tylko zwiększyłoby jego złożoność - patrz http://teddziuba.com/2011/02/the-case-against -queues.html. Jestem zainteresowany jego rozwiązaniem i uproszczeniem go w tym samym czasie. – Hugo

10

Wypróbuj Gevent.
Możesz utworzyć obiekt Greenlet dla swojego długiego zadania.
Ta ulotka jest 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]) 

Również można użyć Gevent jako server dla Kolby:

from gevent.wsgi import WSGIServer 
from yourapplication import app 

http_server = WSGIServer(('', 5000), app) 
http_server.serve_forever() 
Powiązane problemy