Распараллеливание потока Python, выходящее из GIL

Я перефразирую свой вопрос, потому что я думаю, что многие думали, что это был вопрос "есть ли у python темы". Это так, но CPython также имеет GIL, который никогда не будет планировать более одного потока в любой момент времени. Это делает потоки CPython бесполезными для ресурсоемких вычислений.

Мне нужно использовать темы; параллелизм процессов не будет работать для меня из-за затрат на IPC (у меня большие общие объекты).

В настоящее время я использую Jython (без GIL) с JyNI, чтобы я мог использовать numpy. JyNI - это альфа, но теперь он поддерживает NumPy. Я получил это на работу. Тем не менее, JyNI альфа и глючит, и весь процесс идет медленно.

Я прочитал кучу старых тем. Интересно, был ли жизнеспособный вариант с тех пор? Я вынужден использовать Python 2.7.

Благодарю.

1 ответ

Решение

На данный момент Jython все еще значительно медленнее, чем CPython. В зависимости от программы и того, насколько хорошо JIT может ее оптимизировать, многопоточность может или не может окупиться. Основная цель Jython - совместимость перед производительностью. Он в основном предназначен для склеивания кода, и все еще существует большой потенциал для повышения эффективности. Смотрите, например, zippy, чтобы узнать о невероятно быстрой реализации Python в Java, однако она является экспериментальной и не имеет уровня совместимости с Jython. В некотором смысле это представляет противоположную цель дизайна.

Теперь добавление JyNI в Jython точно не делает его быстрее, но пока я обнаружил, что оптимизация производительности в JyNI была бы преждевременной, и обычно часть Jython в любом случае доминирует во время выполнения. Кроме того, например, для NumPy рабочая нагрузка на собственные числовые значения значительно доминирует в стоимости клейкого кода.

Наконец, обратите внимание, что JyNI должен эмулировать GIL на стороне C. Для получения подробной информации посмотрите на бумагу https://arxiv.org/abs/1607.00825. Возможно, будет возможно работать с некоторыми расширениями без GIL - это зависит от деталей реализации, насколько чувствительно расширение к этому. В настоящее время C-сторона GIL является обязательной. Вот почему вам может не пригодиться многопоточность Java при использовании NumPy. C-расширения имеют возможность явно освобождать GIL, например, во время вычислительно интенсивных операций, которые не взаимодействуют с интерпретатором. Я не знаю, использует ли NumPy это.

JyNI альфа и глючит

Обязательно сообщайте об ошибках на трекере.

Другие вопросы по тегам