Есть ли в Python очередь распределенных задач, позволяющая убивать зависшие задачи, которые не хотят сотрудничать? - PullRequest
6 голосов
/ 16 января 2012

В основном у меня много задач (партиями около 1000), и время выполнения этих задач может варьироваться в широких пределах (от менее секунды до 10 минут). Я знаю, что если задача выполняется более минуты, я могу ее убить. Эти задачи являются шагами по оптимизации некоторой модели интеллектуального анализа данных (но не зависят друг от друга) и проводят большую часть времени внутри какой-либо функции расширения C, поэтому они не будут сотрудничать, если я попытаюсь убить их изящно.

Существует ли распределенная очередь задач, которая вписывается в эту схему? AFAIK: celery позволяет прерывать задачи, которые готовы к сотрудничеству. Но я могу ошибаться.

Я недавно задал похожий вопрос об уничтожении зависающих функций в чистом Python Убить зависающую функцию в Python в многопоточной среде .

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

Ответы [ 3 ]

6 голосов
/ 20 января 2012

Сельдерей поддерживает ограничение по времени .Вы можете использовать ограничения по времени, чтобы убить долго выполняющиеся задачи.Помимо задач убийства вы можете использовать ограничения soft , которые позволяют обрабатывать SoftTimeLimitExceeded исключений в задачах и завершать задачи чисто.

from celery.task import task
from celery.exceptions import SoftTimeLimitExceeded

@task
def mytask():
    try:
        do_work()
    except SoftTimeLimitExceeded:
        clean_up_in_a_hurry()
0 голосов
/ 26 февраля 2014

Когда вы отменяете задачу сельдерея, вы можете предоставить ей дополнительное ключевое слово terminate=True.

task.revoke(terminate=True)

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

0 голосов
/ 16 января 2012

Pistil позволяет управлять несколькими процессами, в том числе убивать неработоспособные задачи.

Но:

  • это бета-версия программного обеспечения, даже если он работает на Gunicorn, который надежен
  • Я не знаю, как он обрабатывает 1000 процессов
  • Связь между процессами еще не включена, поэтому вам придется настроить свой собственный, используя, например, zeromq

Другая возможность - использовать сигнал таймера , чтобы он выдал исключение через 36000 секунд.Но сигналы не срабатывают, если кто-то приобретает GIL, что может сделать ваша C-программа.

...