Подтвердить что ты не робот

Почему задача Python для ввода-вывода не заблокирована GIL?

python нарезание резьбы документация гласит, что "... Threading по-прежнему является подходящей моделью если вы хотите одновременно запускать несколько задач с привязкой к вводу/выводу ", по-видимому, потому, что процессы, связанные с вводом-выводом, могут избежать GIL, который предотвращает потоков от параллельного выполнения в задачах, связанных с ЦП.

Но я не понимаю, что задача ввода-вывода по-прежнему использует процессор. Так как он мог не столкнуться с теми же проблемами? Это потому, что ввод-вывод связанная задача не потребует управления памятью?

4b9b3361

Ответ 1

GIL в CPython 1 касается только исполняемого кода Python. Потокобезопасное расширение C, использующее много CPU, может выпустить GIL, если ему не нужно взаимодействовать со временем выполнения Python.

Как только код C должен "поговорить" с Python (прочитайте: вернитесь во время выполнения Python), тогда ему нужно снова получить GIL, то есть GIL должен установить защиту/атомное поведение для "интерпретатор" (и я использую этот термин свободно) и не должен одновременно запускать собственный/не-Python-код.

Освобождение GIL вокруг ввода-вывода (блокирование или нет, использование CPU или нет) - это одно и то же - пока данные не будут перемещены в Python, нет причин для получения GIL.


1 GIL является спорным, поскольку он предотвращает использование многопоточных программ CPython в полной мере в многопроцессорных системах в определенных ситуациях. Обратите внимание, что потенциально блокирующие или длительные операции, такие как обработка ввода-вывода, обработка изображений и хруст числа NumPy, происходят за пределами GIL. Поэтому только в многопоточных программах тратят много времени внутри GIL, интерпретируя байт-код CPython, что GIL становится узким местом.

Ответ 2

Все Python-блокирующие примитивы ввода-вывода освобождают GIL, ожидая, когда блок ввода-вывода будет разрешен, - это так просто! Разумеется, им нужно будет снова приобрести GIL, прежде чем продолжить выполнение кода Python, но для интервалов с длинными интервалами между машинами и циклами, в которых они просто ждут какой-либо системы ввода-вывода, они не "Мне нужен GIL, поэтому они не держатся за это!