Держит ли CPython GIL гарантию остановки всех потоков cpython?
CPython является многопоточным приложением, и поэтому в Unix он использует (p) потоки. Расширения Python (написанные, скажем, на C) часто должны содержать GIL, чтобы гарантировать, что объекты Python не будут повреждены в критических разделах кода. Как насчет других типов данных? В частности, гарантирует ли удержание GIL в расширении Python остановку всех остальных потоков CPython?
Причина для того, чтобы спросить, заключается в том, что я пытаюсь портировать на FreeBSD расширение Python (которое работает на Linux и OSX), которое встраивает ECL компилятора / системы Lisp с использованием Boehm GC и которое вылетает во время инициализации встроенного Boehm GC. Обратные следы предполагают, что другой поток запускает и вызывает хаос (реализация pthread в Linux достаточно сильно отличается от FreeBSD, чтобы ожидать проблем в этом направлении). Есть ли еще один мьютекс в CPython, который можно использовать для блокировки?
1 ответ
В частности, гарантирует ли удержание GIL в расширении Python остановку всех остальных потоков CPython?
Короткий ответ - нет - если другие потоки выполняют код без удержания GIL (например, если они работают с расширением C, которое выпускает GIL), то они будут работать до тех пор, пока не попытаются повторно получить GIL (обычно, когда они попробуй вернуть (данные) в мир питона).
Также возможно, что основные части CPython (основной интерпретатор и / или встроенные функции / пакеты могут высвобождать GIL в аналогичных обстоятельствах / причинах, которые вы сделали бы в расширении. Хотя я понятия не имею, действительно ли они это делают.