Более простые блоки параллелизма для Python? - PullRequest
2 голосов
/ 30 октября 2009

Кажется, что в стандартной библиотеке Python отсутствуют различные полезные концепции, связанные с параллелизмом, такие как атомарный счетчик, исполнитель и другие, которые можно найти, например, в. java.util.concurrent. Существуют ли какие-либо внешние библиотеки, которые бы обеспечивали более простые строительные блоки для параллельных приложений Python?

Ответы [ 5 ]

5 голосов
/ 30 октября 2009

Kamaelia, как уже упоминалось, нацелена на упрощение параллелизма в Python.

Первоначальным вариантом использования были сетевые системы (которые, естественно, являются параллельными), разработанные с точки зрения «Как мы можем сделать эти системы проще в разработке и обслуживании».

С тех пор жизнь пошла дальше, и она используется в гораздо более широком спектре проблемных областей от настольных систем (таких как приложения для досок, моделирование баз данных, инструменты для обучения детей чтению и письму) до внутренних систем для веб-сайтов ( например, материалы для перекодирования и преобразования пользовательских изображений и видео для воспроизведения в Интернете в различных сценариях и приложениях для обмена SMS / текстовыми сообщениями.

Основная концепция по сути та же идея, что и конвейеры Unix - за исключением того, что вместо процессов у вас могут быть генераторы, потоки или процессы python - которые называются компонентами. Они общаются через входящие и исходящие сообщения - столько, сколько вам нравится, а не просто stdin / stdout / stderr. Также вместо того, чтобы требовать сериализованных файловых интерфейсов, вы передаете между компонентами полноценные объекты Python. Кроме того, вместо того, чтобы ограничиваться конвейерами, вы можете иметь произвольные формы - графические линии.

Полный учебник (видео, слайды, загружаемый буклет в формате PDF) можно найти здесь:

Или 5-минутная версия здесь (О'Рейли зажечь разговор):

Основное внимание в библиотеке уделяется прагматической разработке, безопасности системы и простоте обслуживания, хотя в последнее время предпринимаются некоторые усилия по добавлению некоторого синтаксического сахара. Как и все разработчики (я и другие :-) приветствуем отзывы о его улучшении.

Вы также можете найти больше информации здесь: - http://www.slideshare.net/kamaelian

Прежде всего, ядро ​​Камаэлии (Аксон) было написано для того, чтобы облегчить мою повседневную работу и обернуть передовую практику (передачу сообщений, программную транзакционную память) многоразовым способом. Я надеюсь, что это сделает вашу жизнь проще: -)

5 голосов
/ 30 октября 2009

Хотя это может быть неочевидно сразу, itertools.count - это действительно атомный счетчик (операция only на его экземпляре x, пишется next(x), эквивалентно "атомарному ++x", если C имел такую ​​концепцию ;-). Редактировать : по крайней мере, это точно верно в CPython; Я думал, что это было частью стандартного определения Python, но, очевидно, IronPython и Jython не согласны (не обеспечивая потокобезопасность count.next в их текущих реализациях), поэтому я вполне могу ошибаться!

То есть, предположим, у вас есть структура данных, такая как:

  counters = dict.fromkeys(words_of_interest, 0)
  ...
  if w in counters: counters[w] += 1

и ваша проблема в том, что последний инкремент не является атомарным, поэтому, если два потока одновременно обрабатывают одно и то же слово, представляющее интерес, два инкремента могут помешать (только один "возьмет", поэтому счетчик будет увеличен только одним, а не двумя). Тогда:

  counters = dict((w, itertools.count()) for w in words_of_interest)
  ...
  if w in counters: next(counters[w])

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

(К сожалению, не существует очевидного, документированного способа «извлечь текущее значение счетчика», хотя на самом деле str(x) действительно возвращает строку, такую ​​как 'count(3)', из которой текущее значение может быть снова проанализировано; - ).

3 голосов
/ 30 октября 2009

kamaelia предоставляет инструменты для абстрагирования параллелизма потоков или процессов и т. Д.

3 голосов
/ 30 октября 2009

Параллельность в Python (по крайней мере, CPython) и Java сильно отличается, по крайней мере, частично из-за Глобальной блокировки интерпретатора (GIL). Вообще, параллелизм в Python достигается не с потоками, а с процессами. См. multiprocessing для "стандартного" модуля параллелизма.

Кроме того, ознакомьтесь с "Любопытным курсом по сопрограммам и параллелизму" , чтобы узнать о некоторых методах параллелизма, которые были довольно новыми для меня, пришедшими из Java. Дэвид Бизли (автор) - «Умный парень»; когда дело доходит до Python в целом и параллелизма в частности.

0 голосов
/ 25 мая 2016

P-worker создает абстракцию «Job-Worker» над многопроцессорной библиотекой python. Это упрощает параллелизм с многопроцессорной обработкой, запуская «Рабочие», которые имеют определенные навыки / атрибуты (определенные функции), и предоставляя очередь, откуда они получают «Рабочие места». Это несколько похоже на пул потоков, только с процессами вместо потоков. Поэтому он лучше подходит для большого количества инструкций процессора. Вы также можете использовать его для создания нескольких экземпляров одного приложения или даже для «Рабочих» с несколькими потоками.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...