Джанго не блокирует электронную почту? Недостатки в threading.thread или подпроцесс? - PullRequest
5 голосов
/ 04 мая 2011

У меня есть сайт Django. Определенные действия конечного пользователя отправляют электронную почту остальным пользователям в группе.

Когда количество пользователей становится> 20, это может добавить 1-3 секунды к циклу запроса, что мне не нравится. Я хотел бы иметь возможность отправлять электронную почту из неблокирующей функции.

Я знаю, что RabbitMQ и Celery вместе могут решить эту проблему, но с 200 пользователями это кажется чрезмерным и добавляет еще два приложения, которые я должен установить, понять и присмотреть за детьми.

Я провел некоторое исследование, и похоже, что и многопоточность. Поток и подпроцесс - это способы обернуть неблокирующий вызов. Я упускаю очевидный способ сделать это? Есть ли недостатки в использовании подхода threading.thread или подпроцесса?

Спасибо, Ted

Ответы [ 2 ]

9 голосов
/ 04 мая 2011

Перенос работы на какой-либо другой внешний процесс - действительно правильная вещь, и, как только вы это сделаете, вряд ли это будет последний раз, когда вы это сделаете. Celery / RabbitMQ - достойное решение, и приятно, что они уже есть. В последних выпусках RabbitMQ есть приличное веб-приложение для управления и приличный API-интерфейс, который значительно облегчит присмотр за детьми, а сельдерея хорошо работает в приложениях Django.

Вы можете сделать это с помощью подпроцесса или потоков, но, честно говоря, я думаю, что это плохая привычка. К сожалению, это самый простой способ сделать то, что вы хотите сделать, если вы не хотите разгрузить вещи.

Если вы хотите полностью перейти к «асинхронной электронной почте из гетто», вы можете сделать так, чтобы ваше приложение просто сбрасывало электронные письма в файлы в каталоге и выполняло задание cron, проверяющее каталог для файлов в этом каталоге каждую минуту, и отправляло их как электронные письма, но на самом деле это гораздо больше работы, чем кролик / сельдерей.

Я говорю, просто иди с кроликом / сельдереем. Это не так много работы, как кажется, и это стоит того, чтобы идти вперед.

0 голосов
/ 30 января 2013

Вы давно решили эту проблему, но у меня была точно такая же проблема, и это был самый быстрый способ перейти к «асинхронному письму гетто», которое вы упомянули:

http://djangosnippets.org/snippets/1864/

Я добавил обезьянный патч, описанный здесь , чтобы избавиться от исключения потоков:

import threading
threading._DummyThread._Thread__stop = lambda x: 42

А теперь Боб, как говорится, мой дядя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...