темы и сокеты питона - PullRequest
       3

темы и сокеты питона

4 голосов
/ 07 февраля 2011

У меня вопрос "Я просто хочу это понять" ... во-первых, я использую python 2.6.5 в Ubuntu.

Итак ... потоки в python (через модуль потоков) толькопотоки ", и просто говорит GIL запускать блоки кода из каждого" потока "в определенный промежуток времени и т. д. и т. п., а здесь нет реальных потоков ...

Так что вопросэто - если у меня есть блокирующий сокет в одном потоке, и теперь я отправляю данные и блокирую поток на 5 секунд.Я ожидал заблокировать всю программу, потому что это одна команда C (sock.send), которая блокирует поток.Но я был удивлен, увидев, что основной поток продолжает работать.Таким образом, вопрос в том, как GIL может продолжить и выполнить остальную часть кода после того, как он достигнет команды блокировки, такой как send?Разве здесь не нужно использовать настоящую тему?

Спасибо.

Ответы [ 3 ]

11 голосов
/ 07 февраля 2011

Python использует "реальные" потоки, то есть потоки базовой платформы. В Linux он будет использовать библиотеку pthread (если вам интересно, здесь - реализация ).

Что особенного в потоках Python - это GIL: поток может изменять структуры данных Python, только если он удерживает эту глобальную блокировку. Таким образом, многие операции Python не могут использовать несколько процессорных ядер. Тем не менее, поток с блокирующим сокетом не будет содержать GIL, поэтому он не влияет на другие потоки.

GIL часто неправильно понимают, заставляя людей верить, что потоки в Python почти бесполезны. Единственное, что мешает GIL, - это одновременное выполнение «чистого» кода Python на нескольких процессорных ядрах. Если вы используете потоки, чтобы адаптировать графический интерфейс или запускать другой код во время блокировки ввода-вывода, GIL не повлияет на вас. Если вы используете потоки для запуска кода в каком-либо расширении C, например NumPy / SciPy, одновременно на нескольких процессорных ядрах, GIL также не повлияет на вас.

6 голосов
/ 07 февраля 2011

Python Вики-страница на GIL упоминает, что

Обратите внимание, что потенциально блокирующие или длительные операции, такие как I / O , обработка изображений и сокращение числа NumPy, происходят вне GIL.

3 голосов
/ 07 февраля 2011

GIL (глобальная блокировка интерпретатора) - это просто блокировка, она сама по себе ничего не запускает.Скорее, интерпретатор Python захватывает и снимает эту блокировку по мере необходимости.Как правило, блокировка удерживается при запуске кода Python, но снимается для вызовов функций более низкого уровня (например, sock.send).Поскольку потоки Python являются реальными потоками уровня ОС, потоки не будут запускать код Python параллельно, но если один поток вызывает долго выполняющуюся функцию C, GIL освобождается, и другой поток кода Python может работать до завершения первого.*

...