Скрытые узкополосные узкие места в Jython? - PullRequest
5 голосов
/ 19 ноября 2010

Какие распространенные скрытые вещи могут мешать многопоточности / параллелизму в Jython? У меня есть некоторый параллельный код (использующий библиотеку потоков Python), который не масштабируется за 3-4 процессора, и я уверен, что это не из-за каких-либо из этих очевидных ошибок:

  • Явные блокировки

  • Вызов кода библиотеки, который требует синхронизации (алгоритм, который я пытаюсь распараллелить, в основном написан с нуля и не использует никаких библиотек.)

По сути, все, что делает алгоритм - это набор строк, поиск по списку и словарю, а также математика. Насколько я понимаю, в отличие от CPython, Jython не имеет GIL.

Ответы [ 3 ]

4 голосов
/ 20 ноября 2010

Доступ к переменным является одним из тех «скрытых» узких мест.Если все потоки обращаются к какой-либо общей структуре данных, между потоками будет происходить синхронизация.

Jython изо всех сил пытается достичь языковой совместимости с CPython.GIL гарантирует, что доступ к локальным / глобальным переменным, членам объекта, элементам dict (технически локальные, глобальные и члены объекта также являются элементами dict) или даже элементам списка является атомарным.Чтобы избежать неожиданностей для пользователей, Jython использует параллельную хэш-карту для реализации диктов.Это означает, что при доступе к любым элементам dict в Jython происходит некоторая синхронизация.Эта синхронизация используется для поддержки доступа к dict из нескольких потоков без их блокировки, но если несколько потоков получат доступ к одной и той же переменной, они получат одинаковую блокировку.

Лучший способ достижения масштабируемости в Jythonлюбой другой язык, чтобы убедиться, что данные, к которым вы обращаетесь в каждом потоке, также не доступны из других потоков.

3 голосов
/ 19 ноября 2010

У Jython нет GIL, но довольно сложно получить много параллелизма.Если у вас есть какая-то часть, которая не может быть выполнена параллельно, вас укусит закон Ахмада :

Ускорение программы, использующей несколько процессоров в параллельных вычислениях, ограниченовремя, необходимое для последовательной части программы.

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

1 голос
/ 20 ноября 2010

Вы пробовали анализ производительности пакетов?Даже если они явно не для Jython, держу пари, что это поможет.

Сначала я попробую YourKit , если у вас есть доступ к лицензии.

...