Previous Entry Share Next Entry
Celery - немного асинхронности для питончика
and_cesbo
Пишу небольшое веб приложение на питончике и с замечательным фрэймворком Flask.
В приложении необходимо рассылать почту - торговая статистика,уведомления о транзакциях, личные сообщения, новостные рассылки. Всё как обычно.
Изучил возможные способы отправки почты: Amazon SES, Sendgrid, Google Apps (остановился на нём). Во всех случаях при отправке письма происходит задержка, что не очень хорошо, даже плохо - пока пройдёт подключение, уйдут данные (а их может быть неприлично много) - проходит вечность.
Начал изобретать велосипед... и тут на помощь пришёл Celery.

Суть Celery - параметры для вызова функции передаются через очередь сообщений (или базу данных) на процесс (или на группу процессов) обрабатывающий эту очередь.
Так как вся система использует MongoDB то и для передачи сообщений выбрал его.

Создал файл sender.py. Немножко обрезанный вариант:

from config import config
from celery import Celery

mongodb_url = 'mongodb://%s:%d' % (config.get('DB_HOST', 'localhost'),
                                   config.get('DB_PORT', 27017), )
celery = Celery('sender', broker=mongodb_url)

@celery.task
def _send_mail(name, dst, subj='', text=None, html=None):
    mail = GoogleMail()
    src = sender_address if None == name else '%s <%s>' % (name, sender_address, )
    mail.send(src, dst, subj, text, html)

def send_mail(sender, user, subj, content):
    html = make_html(content)
    _send_mail.delay(sender, user['email'], subj, html=html)


Запуск воркера: celery multi start sender -A sender -l info --autoreload

Это всё. В любом месте приложения импортирую функцию: from sender import send_mail
Запускаю send_mail для отправки письма. Возвращение в основной процесс происходит моментально. Весь интерфейс работает без задержек. Все счастливы :)

Update: со стороны фласка никаких дополнительных действий не требуется, всё красиво запускается и работает без проблем

?

Log in

No account? Create an account