Отладка многопроцессорности в Python

Ответы:

6

Настоящие многопроцессорные программы на Python (в отличие от многопоточных программ на Python, которые имеют дело с страшным GIL ) ничем не отличаются от программ на любом другом языке. Все они имеют одинаковые основные проблемы:

  1. Назначение задач и отчет о результатах. Даже если они в основном работают с независимыми наборами данных, им обычно приходится возвращаться в главный поток, чтобы сообщать о результатах и ​​получать новые данные для работы. Это может быть проблемой.
  2. Расовые условия. Процессы пытаются использовать одноразовый ресурс, и им нужно использовать мьютекс (или что-то подобное), чтобы не перебирать данные друг друга. Неспособность защитить эти виды ресурсов может привести к действительно, очень болезненным сеансам отладки.
  3. Секвенциальности. Иногда вы пытаетесь сделать что-то параллельное, чего нет. Различные процессы в конечном итоге ждут друг друга, чтобы сделать что-то, и конечный результат заключается в том, что вы, для всех намерений и целей, взяли последовательную программу, сделали ее параллельной, и она все равно заканчивается выполнением за линейное время (или хуже).

Хотя существуют методы разработки, которые пытаются избежать каждой из этих проблем, в конце концов вам действительно нужно подумать о том, что вы делаете. Я рекомендую проводить тяжелые стресс-тесты - гораздо больше, чем вы думаете, которые могут произойти в реальной жизни, - чтобы у вас был хороший шанс попасть в Windows «Возможности» и взорваться в процессе разработки, а не в середине крупной демонстрации или в процессе производства.

Мы использовали файлы журналов с микросекундной меткой времени, а затем создавали приложение для просмотра журналов с цветовой кодировкой, чтобы мы могли попытаться визуализировать то, что происходило между N-процессами, выполняемыми на M-процессорах. Мы также попытались (и в основном преуспели) в создании системы, которая будет выгружать файлы журналов для воссоздания контекста сбоя.

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

Питер Роуэлл
источник
25

Одна вещь, которую я считаю очень полезной, - это использовать существующий регистратор в multiprocessingмодуле. Попробуйте это в своем основном коде:

import multiprocessing, logging
mpl = multiprocessing.log_to_stderr()
mpl.setLevel(logging.INFO)

Смотрите также: http://docs.python.org/library/multiprocessing.html#logging

Кроме того, вы можете получить доступ к имени текущего процесса, используя:

cpname = multiprocessing.current_process().name
# print cpname
mylogger.info("{0} is currently doing...".format(cpname))

Смотрите: http://docs.python.org/library/multiprocessing.html#multiprocessing.current_process

Кроме этого, я не знаю ничего другого, кроме стандартных методов отладки, таких как pdb& co.

exhuma
источник