запускать собственные темы в Python Paste - PullRequest
1 голос
/ 22 октября 2009

Я пишу веб-приложение с использованием пилонов и пасты. У меня есть работа, которую я хочу выполнить после завершения HTTP-запроса (отправить несколько электронных писем, написать что-то в базу данных и т. Д.), Для которых я не хочу блокировать HTTP-запрос.

Если я запускаю поток для этой работы, это нормально? Я всегда вижу такие вещи, как вставка убивает зависшие темы и т. Д. Будет ли это убивать мои темы, которые работают?

Что еще я могу сделать здесь? Есть ли способ, которым я могу сделать запрос возврата, но какой-то код выполняется после того, как он сделан?

Спасибо.

Ответы [ 4 ]

0 голосов
/ 04 декабря 2009

Чтобы ответить на ваш основной вопрос напрямую, вы должны иметь возможность использовать темы так, как вам хочется. Часть "убивая зависшие темы" - это паста, которая очищает свои, а не свои.

Существуют и другие пакеты, которые могут помочь и т. Д., Но я бы посоветовал вам начать с простых тем и посмотреть, как далеко вы продвинетесь. Только тогда вы узнаете, что вам нужно дальше.

(Обратите внимание, что здесь «Thread.daemon» в большинстве случаев не имеет к вам отношения. Установка значения true гарантирует, что запускаемый вами поток не будет препятствовать завершению всего процесса. Однако это будет означать, что если процесс завершится » «чисто» (вместо того, чтобы быть вынужденным выйти) ваш поток будет прерван, даже если он не выполнит свою работу. Будь то проблема и то, как вы справляетесь с подобными вещами, полностью зависит от ваших собственных требований и дизайна.

0 голосов
/ 28 октября 2009

Я думаю, что лучшее решение - это система обмена сообщениями, потому что она может быть настроена так, чтобы не потерять задачу, если процесс пилонов будет остановлен. Я бы всегда использовал процессы над потоками, особенно в этом случае. Если вы используете Python 2.6+, используйте встроенную многопроцессорную или вы всегда можете установить модуль обработки, который вы можете найти в pypi (я не могу опубликовать ссылку, потому что я новый пользователь).

0 голосов
/ 20 ноября 2009

Взгляните на шестерёнку, она была специально создана для выполнения задач «рабочим». Они даже могут справиться с этим на другом языке полностью. Вы можете вернуться и спросить, выполнено ли задание, или просто дать ему завершиться. Это должно хорошо работать для многих задач.

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

0 голосов
/ 22 октября 2009

Вы можете использовать потоковый подход (может быть, установка свойства Thead.daemon поможет - но я не уверен).

Тем не менее, я бы предложил изучить систему очередей задач. Вы можете поместить задачу в очередь (что очень быстро), тогда слушатель может асинхронно обрабатывать задачи, что позволяет быстро возвращать HTTP-запрос. Мне известны две очереди задач для Django:

Вы также можете рассмотреть возможность использования более «корпоративного» решения для обмена сообщениями, такого как RabbitMQ или ActiveMQ .

Редактировать : предыдущий ответ с некоторыми хорошими указателями.

...