Jestem nieco zdezorientowany, kiedy mam zadzwonić pod numer PyEval_InitThreads
. Ogólnie rozumiem, że PyEval_InitThreads
musi być wywoływany, gdy używany jest wątek inny niż Python (tj. Wątek utworzony w module rozszerzenia).Kiedy ma się nazywać PyEval_InitThreads?
Jednak jestem zdezorientowany, jeśli PyEval_InitThreads
jest dla programów C, które osadzają interpreter Pythona, lub programy Python, które importują moduły rozszerzenia C, lub oba.
Tak więc, jeśli napiszę moduł rozszerzenia C, który będzie wewnętrznie uruchomić wątek, czy podczas inicjowania modułu muszę wywołać PyEval_InitThreads
?
Również, PyEval_InitThreads
implicitly acquires the Global Interpreter Lock. Więc po wywołaniu PyEval_InitThreads
, prawdopodobnie GIL musi być wydany lub wystąpi impas. Jak zwolnić zamek? Po przeczytaniu dokumentacji, wydaje się, że jest to sposób na uwolnienie GIL. Jednak w praktyce, jeśli używam następujący kod w module rozszerzeń C:
PyEval_InitThreads();
PyEval_ReleaseLock();
... następnie w czasie wykonywania Python przerywa się:
Fatal Python error: drop_gil: GIL is not locked
Więc jak można zwolnić GIL po nabyciu to z PyEval_InitThreads
?
Spróbuj bez 'PyEval_ReleaseLock()'. GIL jest nabywany z ważnego powodu; zwolnienie go przed wywołaniem innych funkcji API C z Pythona ulegnie awarii. –