Всегда ли поток, привязанный к процессору, требует GIL в Python?

Я просматривал слайды Дэвида Бизли, связанные с GIL, пытаясь понять, что вызывает переключение потоков в Python. Однако многое выше моего понимания.

http://www.dabeaz.com/python/UnderstandingGIL.pdf

Кажется, что примерно через 100 тиков текущий поток освобождает GIL и повторно получает его, если он привязан к процессору?

С другой стороны, если он спит или привязан к вводу-выводу, другой поток получит GIL.

Итак, если поток привязан к ЦП, он будет продолжать получать данные, пока не завершит задачу?


person Moondra    schedule 23.03.2019    source источник


Ответы (1)


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

Но если нет других потоков, готовых к запуску (например, все остальные ожидают ввода-вывода), тогда работающий поток будет получать блокировку каждый раз. Но тогда все равно будут накладные расходы каждые 100 тиков для танца освобождения-возврата.

person JohanL    schedule 23.03.2019
comment
нужен арбитраж, чтобы решить, кому будет позволено его получить. Спасибо. Случается ли вам, как решается, какая нить получит GIL? - person Moondra; 24.03.2019
comment
Нет, я не уверен. Но поскольку потоки обрабатываются ОС, я думаю, что ОС также отвечает за арбитраж, так что это может зависеть от ОС. (Конечно, виртуальная машина Python может мешать, но я не понимаю, почему она должна...) - person JohanL; 24.03.2019