Дарю годный
сниппет использования библиотеки
processing в
Python под MS Windows.
Для реализации
моей очередной идеи, связанной с
сокращением ручного труда, какабычно,
понадобился мне инструмент контроля
нескольких одновременно работающих
процессов в MS Windows. Суть в том, что мне
надо стартовать некоторое количество
процессов, дождаться пока все завершат
работу, после этого запустить следующий
этап обработки данных. После целых пяти
минут работы соображалкой «что у нас
есть в винде под такую задачу» я понял,
что делать «супервизор» буду на Python.
Ибо для него есть прекрасная библиотека
processing.
Библиотека
замечательная, популярная, хорошо
документированная.
Но (куда же без «но») опять же, какабычно,
имеющиеся в документации примеры не
захотели работать в моих условиях.
Условия просты — ждать завершения всех
процессов (значит берем Pool), аккуратно
выводить принтуемые сообщения из
подпрограммы (значит берем Lock).
Вроде должно
работать, но не работает. Не буду приводить
свои промежуточные попытки добиться
желаемого, приведу хороший, годный
вариант:
def mpcWorker(tup): lock, params = tup lock.acquire() print 'mpcWorker, params = "%s"' % params lock.release() cmdl = ['cmd.exe', '/c', params] import subprocess subprocess.call(cmdl) res = 'done mpcWorker, params = "%s"' % params lock.acquire() print res lock.release() return res def mprocessing(): ''' Don't mix prints, get results back ''' from processing import Process, Pool, Manager man = Manager() lock = man.Lock() pool = Pool(processes=2) tasks = [(lock, 'ping -n 5 localhost'), (lock, 'ping -n 3 ya.ru')] print 'Pool.map result = "%s"' % pool.map(mpcWorker, tasks) pool.close() pool.join() |
Справедливости
ради замечу, что никакой рокетсаенс
тут нет. Рецепт смикширован из нескольких
легко нагугливаемых форумных постов.
В качестве бонуса применения именно
map() имеем список возвращаемых воркерами
значений, удобно.
Секретов, не
отраженных в примерах документации,
тут два. Один — Lock надо брать из Manager-а.
Другой — пул надо close() и потом join().
Обязательно.
Если выкинуть
ненужное, весь супервизор умещается в
10 строк. Обожаю питон.
Комментариев нет:
Отправить комментарий