Есть ли такая вещь, как рабочее время на питоне?
-
09-10-2019 - |
Вопрос
Я написал красивый многопоточный сценарий, и когда я запустил его, он работал хуже с 25 потоками, чем с прямым вызовом обработчика потока.
Затем я обнаружил глобальную блокировку переводчика. Я хочу спросить, прежде чем я отказался от Python для этого сценария и переписываю вещь в чем -то другом, есть ли способ выполнить реальное рабочее многопоточное многопоточное чтение на Python?
Решение
Другой подход заключается в том, чтобы отказаться от потоков и вместо этого использовать Многопроцессорная Модуль (Python 2.6+), который оборачивает GIL, и имеет API, который, по крайней мере, похож на тот, который в модуле потока.
Другие советы
Теперь это интересный вопрос - я не думаю, что в прямом эфире сбегает из Гила.
Неверный питон Предполагается, что он улучшил производительность «параллелизма» по сравнению с CPYTHON с использованием его Микротчики, но я не думаю, что это ускользает от Гила.
Кроме того, согласно Гил Пейдж на python.org, У Jython и Ironpython нет Gil.
Правильный ответ в значительной степени зависит от того, что вы делаете.
Внезапно связанные с процессором (и блокирующие вводимые) задачи, такие как сжатие и рендеринг изображений, обычно выполняются с помощью собственного кода, а нативные библиотеки обычно выпускают GIL во время работы, что позволяет параллельно. Когда вы можете изолировать процессору, интенсивной, с узким нативным вызовом, вы получаете параллелизм, нативную производительность, где она считается, и удобство написания большей части кода в Python.
Не весь код имеет те небольшие изолированные блоки вычислительного кода, которые можно аккуратно реализовано в собственной библиотеке, но многое делает.
В CPYTHON (внедрение Python в C), нет, на мой взгляд. (Если я ошибаюсь, пожалуйста, поправьте меня, я бы хотел знать, существует ли решение!).
Возможно, вы захотите заинтересовать Ironpython (.net) или jpython (java/jwm). Я не использовал их, но я считаю, что, по крайней мере, один из них поддерживает потоки, основанные на данной среде исполнения.
Вы можете попробовать многопроцессорная Модуль, если это применимо к вашей проблеме.