2009-10-30 3 views
2

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

ответ

5

Kamaelia, как уже упоминалось, имеет целью упростить работу с параллелизмом в python.

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

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

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

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

или 5 минутную версию здесь (O'Reilly воспламенить разговор):

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

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

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

+0

Что касается STM BTW - см. Эту страницу для получения подробной информации о том, как использовать упрощенную STM - http://www.kamaelia.org/STM. Если вы знакомы с контролем версий, STM не должен быть странным и страшным, даже если фраза/имя может быть. –

3

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

Кроме того, ознакомьтесь с "A Curious Course on Coroutines and Concurrency" для некоторых методов параллелизма, которые были для меня совершенно новыми, исходящими из Java. Дэвид Бэзли (автор) - Smart Guy ™, когда речь заходит о Python вообще и о параллельности в частности.

3

kamaelia предоставляет инструменты для реферирования параллелизм до нитей или процесса и т.д.

5

Хотя это может быть не сразу очевидно, itertools.countявляется действительно атомный счетчик (на только операции на примере его 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)', из которой текущее значение может быть снова разобрано ;-).

+1

Разве это не просто атомизм, а просто реализация функции CPython и способ работы кода GIL и C? –

+0

'd = defaultdict (itertools.count) \ n для w в словах_интерес: следующий (d [w])' – jfs

+1

@JFSebastian, ваш вариант не является внутренне «атомарным» (существует определенная разница в потокобезопасности между * * добавление ** ключа к dict - включая неявно через defaultdict - что может вызвать повторную запись, в отличие от строго используемых только существующих ключей, что и делает мой код). @Tuure, я просто просмотрел источники IronPython и Jython, и, похоже, они согласны с вашей интерпретацией - что звучит для меня необычно, но я думаю, что я, возможно, ошибаюсь здесь, - позвольте мне изменить, чтобы добавить пункт об этом! –

0

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