Sono un po 'confuso su quando dovrei chiamare PyEval_InitThreads
. In generale, capisco che PyEval_InitThreads
deve essere chiamato ogni volta che viene utilizzato un thread non Python (cioè un thread che viene generato all'interno di un modulo di estensione).Quando si intende chiamare PyEval_InitTread?
Tuttavia, sono confuso se PyEval_InitThreads
è per programmi C che incorporano l'interprete Python o programmi Python che importano moduli di estensione C o entrambi.
Quindi, se scrivo un modulo di estensione C che avvierà internamente un thread, devo chiamare PyEval_InitThreads
durante l'inizializzazione del modulo?
Inoltre, PyEval_InitThreads
implicitly acquires the Global Interpreter Lock. Quindi, dopo aver chiamato PyEval_InitThreads
, presumibilmente la GIL deve essere rilasciata o si verificherà un deadlock. Quindi, come si rilascia il lucchetto? Dopo aver letto la documentazione, PyEval_ReleaseLock()
sembra essere il modo per rilasciare GIL. Tuttavia, in pratica, se uso il seguente codice in un modulo di estensione C:
PyEval_InitThreads();
PyEval_ReleaseLock();
... poi in fase di esecuzione Python si interrompe con:
Fatal Python error: drop_gil: GIL is not locked
così come si fa rilasciare il GIL dopo l'acquisizione con PyEval_InitThreads
?
Provare senza 'PyEval_ReleaseLock()'. Il GIL è acquisito per una buona ragione; rilasciarlo prima di chiamare altre funzioni API C da Python sta andando in crash. –