контролировать застрявшие процессы Python - PullRequest
5 голосов
/ 11 августа 2011

У меня есть скрипт Python, который выполняет URL-запросы с использованием urllib2.У меня есть пул из 5 процессов, которые работают асинхронно и выполняют функцию.Эта функция выполняет URL-вызовы, получает данные, анализирует их в требуемом формате, выполняет вычисления и вставляет данные.Количество данных варьируется для каждого URL-запроса.

Я запускаю этот скрипт каждые 5 минут, используя задание cron.Иногда, когда я делаю ps -ef | grep python, я вижу застрявшие процессы.Есть ли способ, с помощью которого я могу отслеживать значения процессов в классе многопроцессорных систем, которые могут отслеживать процессы, их состояние, означающее, что они завершены, застряли или не работают и так далее?Вот фрагмент кода:

Вот как я называю асинхронные процессы

pool = Pool(processes=5)
pool.apply_async(getData, )

И вот часть getData, которая выполняет запросы urllib2:

try:
    Url = "http://gotodatasite.com"

    data = urllib2.urlopen(Url).read().split('\n')
except URLError, e:
    print "Error:",e.code
    print e.reason
    sys.exit(0)

Есть ли способ отследить застрявшие процессы и запустить их снова?

Ответы [ 2 ]

1 голос
/ 17 августа 2011

Реализуйте механизм ping, если вы склонны использовать многопроцессорность. Я полагаю, вы ищете процессы, которые зависли из-за медленного ввода-вывода?

Лично я бы пошел с очередью (не обязательно сервер очереди ), скажем, например, ~/jobs - это список URL-адресов для работы, а затем имел бы программу, которая берет первое задание и выполняет Это. Тогда это просто вопрос бухгалтерии - скажем, запишите программу, когда она была запущена, и каков ее PID. Если вам нужно убить медленные задания, просто убейте PID и пометьте задание как невыполненное.

0 голосов
/ 17 августа 2011

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

...