Ответ 1
Вам следует рассмотреть возможность использования Celery. Он очень широко используется в веб-фреймворках для асинхронной обработки и поддерживает множество различных бэкэнд, таких как AMQP, базы данных и т.д.
Мне нужно было отправить почту из моего простого приложения Flask, поэтому я подумал, что самый простой способ - отправить его с помощью smtplib. Но я должен был сделать это асинхронно - вы не можете просто вставить 3-секундную задержку в запрос - правильно? Поэтому я добавляю электронное письмо в очередь (psql table) и отправляю его из другой программы, которая читает эту таблицу и использует smptlib.
Эта вторая программа (maildonkey) запускается как отдельный процесс в независимой службе upstart.
Теперь мне нужна еще одна из этих небольших асинхронных сервисов, и я думаю, что если я напишу еще один python script (в-третьих, подсчитав мое приложение Flask и "maildonkey" ), или я должен использовать что-то вроде многопроцессорного Python, или даже "потоки" и переписать вторую программу?
(Когда я программировал в Clojure, я мог легко запускать код в отдельном потоке с фьючерсами, поэтому обычно я это делал.)
Вам следует рассмотреть возможность использования Celery. Он очень широко используется в веб-фреймворках для асинхронной обработки и поддерживает множество различных бэкэнд, таких как AMQP, базы данных и т.д.
Попробуйте 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()