Найти - Пользователи
Полная версия: Создание задач через веб интерфейс.
Начало » Python для экспертов » Создание задач через веб интерфейс.
1
CommonUser
У меня есть скрипт на питоне, который выполняется на хосте. Мне нужно стартовать (1) некоторое количество этих скриптов, создавая задачи (параметры к скрипту) с веб страницы. При этом, скрипт может выполняться или пока не упадет, или пока не остановишь. Нужно знать в каком состоянии (2) находится задача, то есть выполнение скрипта, но и возможность остановить (3) выполнение скрипта с веб странички. Иногда нужно получать результат (4), который выдает скрипт (словарь например), а не просто “таска упала” или “выполнилась успешно”. Сам скрипт коммитит в бд (5), а сайт использует эту бд для создания отчетов (6).
Возможно, мне понадобиться “общаться” с выполняемыми задачами (7)

Пока у меня нет понимания как построить архитектуру этого приложения.
Я думаю, сайт складывает в БД-для-задач задачи, “менеджер” мониторит эту БД по расписанию, достает задачи и запускает скрипты на исполнение. Скрипт записывает в БД-для-отчетов результаты выполнения. Сайт берет из БД записи и формирует полный отчет.

Как останавливать задачу с сайта? Скажем у задач есть состояния NEW, STARTED, CANCELED, COMPLETED. Тогда с сайта можно менять состояние задачи в БД на CANCELED. Но тогда придётся на стороне сайта постоянно опрашивать состояния этих задач в . В общем начинаются большие проблемы с синхронизацией.

Другая проблема это общение “менеждера” с множеством запущенных задач. Общение должно быть двухстороннее. Потому как я хочу получать уведомления и данные от задачи. И подавать сигнал, скажем, на остановку задачи. Думаю общение можно сделать с помощью 0MQ (ZeroMQ)

Как-то так. Очень большая вероятность, что тут у меня велосипед на велосипеде. Подскажите что можно придумать для решения моей задачи.

plusplus
Я про celery слышал. Посмотри, может подойдет.
CommonUser
сельдерей не подходит, сельдерей может только запускать таски и узнавать выполнилось или нет. То есть он решает только подзадачу (1), но не решает все остальные. Завершение только экстренное через revoke(task_id, terminate=True, signal=SIGTERM). Мне нужно завершать задачи мягко, чтобы сделать клинап (соединение с бд. освобождение ресурсов, закрытие файлов и убийство детей, и прочее)
Singularity
Я бы наверно на Mongodb сделал.
CommonUser
Singularity
Я бы наверно на Mongodb сделал.

Можете немного подробнее объяснить? Я не знаком с монго. Что с помощью монго я могу решить?
Lexander
CommonUser
сельдерей не подходит, сельдерей может только запускать таски и узнавать выполнилось или нет.
У celery есть целая куча состояний задачи, включающих метаданные (сюда можно записать результат выполнения: результат, трейс ошибки и пр.) плюс можно добавлять свои.
CommonUser
Завершение только экстренное через revoke(task_id, terminate=True, signal=SIGTERM). Мне нужно завершать задачи мягко, чтобы сделать клинап (соединение с бд. освобождение ресурсов, закрытие файлов и убийство детей, и прочее)
А это уже как вы воркеры писать будете.
Для общения с воркерами есть механизм событий, на которые воркер может быть подписан и они будут обработаны так как вам нужно.
Готового решения лично я не искал, но, учитывая типичность задачи и наличие нужных инструментов в celery, рекомендую поискать в интернете - должно быть.

Думаю, что связка Celery + RabbitMQ или другой транспорт вам может подойти.
Я бы рекомендовал вам потратить чуть больше времени на анализ их возможностей.
В документации и есть готовые примеры как раз для вашей задачи.
CommonUser
Что-то я не нашел как писать свой собственный воркер. Вообще мне не нравится документация сельдерея, она написана как-то невнятно местами.

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

This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB