Каков правильный способ запускать некоторый код Python асинхронно?

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

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

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

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

Ответ 1

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

Ответ 2

Попробуйте Gevent.
Вы можете создать объект Greenlet для своей долгой задачи.
Эта зелень зеленая нить.

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 для Flask:

from gevent.wsgi import WSGIServer
from yourapplication import app

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