Вопрос по питону GIL - PullRequest
       16

Вопрос по питону GIL

3 голосов
/ 16 декабря 2009

Означает ли наличие python GIL, что в многопоточности Python операция с одинаковой не так сильно отличается от ее повторения в одном потоке?

Например, если мне нужно загрузить два файла, в чем преимущество того, чтобы делать их в двух потоках, а не загружать их один за другим?

Я пробовал большую математическую операцию в обоих направлениях. Но кажется, что для их завершения требуется почти равное время.

Мне кажется, это неясно. Может ли кто-нибудь помочь мне в этом? Спасибо.

Ответы [ 3 ]

11 голосов
/ 16 декабря 2009

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

  • Если работает не-Python-код (например, библиотека C, ядро ​​и т. Д.), Другие потоки Python могут продолжить работу. Это только чистый код Python, который не может работать в двух потоках одновременно. Поэтому, если вы выполняете дисковый или сетевой ввод / вывод, потоки действительно могут что-то купить, поскольку большую часть времени проводит за пределами самого Python.

  • GIL на самом деле не является частью Python , это деталь реализации CPython ("эталонная" реализация, над которой работают разработчики ядра Python, и которую вы обычно получается, если вы просто запускаете "python" на вашем Linux-компьютере или что-то в этом роде.

    Jython, IronPython и любые другие повторные реализации Python обычно не имеют GIL, и несколько потоков чистого Python могут выполняться одновременно.

  • Случай 0,5: даже если вы полностью чистый Python и не видите небольшого выигрыша в производительности или не получаете его от производительности, некоторые проблемы действительно удобны с точки зрения времени разработчика и сложности решения с потоками. Конечно, это также частично зависит от разработчика.

4 голосов
/ 16 декабря 2009

Это действительно зависит от используемой вами библиотеки. GIL предназначен для предотвращения одновременного изменения объектов Python и его внутренних структур данных. Если вы выполняете загрузку, библиотека, которую вы используете для фактической загрузки, может выпустить GIL, ожидая завершения фактического HTTP-запроса (я бы предположил, что это имеет место с модулями HTTP в стандартной библиотеке, но не проверял).

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

3 голосов
/ 16 декабря 2009

Это зависит от модуля собственного кода, который выполняется. Собственные модули могут освобождать GIL, а затем отключаться и делать свое дело, позволяя другому потоку заблокировать GIL. GIL обычно хранится, пока код, как python, так и native, работает с объектами python. Если вы хотите больше подробностей, вам, вероятно, нужно пойти и прочитать об этом немного. :)

См: Что такое глобальная блокировка интерпретатора (GIL)? и Состояние потока и глобальная блокировка интерпретатора

...