Налагодження багатопроцесорної обробки в Python


Відповіді:


6

Справжні багатопроцесорні програми Python (на відміну від багатопотокових програм Python, які мають справу з жахливим GIL ) нічим не відрізняються від програм на будь-якій іншій мові. Усі вони мають однакові проблеми:

  1. Подання завдання та звітування про результати. Навіть якщо вони здебільшого працюють над незалежними наборами даних, їм зазвичай доводиться повертатися до основного потоку, щоб повідомити про результати та отримати нові дані для роботи. Це може бути задухою.
  2. Умови гонки. Процеси намагаються використовувати окремий ресурс, і їм потрібно використовувати mutex (або щось подібне), щоб не переходити до даних про один одного. Якщо не захистити такі види ресурсів, це може призвести до дійсно дуже болючих сесій налагодження.
  3. Послідовність. Іноді ви намагаєтесь зробити щось паралельне, що не так. Різні процеси в кінцевому підсумку чекають, коли одне щось зробить, і кінцевим результатом є те, що ви за всіма намірами і цілями взяли послідовну програму, зробили її паралельною, і вона все ще закінчується виконанням у лінійний час (або гірше).

Хоча існують методи розвитку, які намагаються уникнути кожної з цих проблем, наприкінці дня вам справді потрібно подумати над тим, що ви робите. Я рекомендую важкі стресові тести - набагато більше того, що ви думаєте, що може трапитися в реальному житті, - щоб у вас є шанс потрапити на ці можливості Windows і вибухнути в процесі розвитку, на відміну від великого демо або під час виробництва.

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

Але найкращий інструмент - хороший дизайн та справді злі, неприємні люди, які намагаються підірвати ваш додаток з води. (Привіт, дзвін!)


26

Одне, що мені здається дуже корисним, - це використовувати наявний реєстратор у 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.