2016-06-23 12 views
5

Sto provando a risolvere un argomento con un collega. Supponiamo che io abbia un'applicazione Python 2.6 che utilizza psycopg2 per comunicare con un database Postgres. L'app è multithread. Quando un thread effettua una chiamata al database usando psycopg2, rilascia il GIL in modo che anche altri thread possano effettuare una chiamata al database?Fa `psycopg2` in Python 2.x blocca GIL

+0

Prova [ricerca di '' Py_BEGIN_ALLOW_THREADS' o PyEval_Save_Thread'] (https://github.com/psycopg/psycopg2/search?utf8=%E2%9C%93&q=py_begin_allow_threads+OR+pyeval_save_thread&type=Code) nella fonte . Sono sparsi qua e là, controlla se il tuo scenario specifico si applica. –

risposta

2

Da una rapida occhiata a the Psycopg release notes, ci sono molti riferimenti al rilascio di GIL. Quindi a quanto pare tenta di rilasciare il GIL quando appropriato. Non hai chiesto uno scenario specifico, quindi non credo sia possibile una risposta più specifica.

+0

"Uno scenario specifico" Dite solo l'operazione di database più comune, selezionando elementi da una tabella? –

0

Come hai detto, esiste una regola che solo il thread che ha acquisito GIL può operare su oggetti Python o chiamare le funzioni API Python/C. Per emulare la concorrenza di esecuzione, l'interprete Python tenta regolarmente di cambiare thread. Il blocco viene rilasciato anche attorno a potenziali operazioni di I/O di blocco come la lettura o la scrittura di un file, in modo che altri thread Python possano essere eseguiti nel frattempo.

più codice di estensione (codice del psycopg2 incluse) manipolare il GIL ha la seguente struttura semplice:

Save the thread state in a local variable. 
Release the global interpreter lock. 
... Do some blocking I/O operation ... 
Reacquire the global interpreter lock. 
Restore the thread state from the local variable. 

Ciò significa che in caso di un'operazione di I/O di blocco (in attesa di risposta della rete da Postgres, per esempio) , il GIL viene rilasciato e altri thread possono continuare la loro esecuzione. Quando l'operazione di I/O di blocco viene completata, il thread tenta di acquisire GIL e continua l'esecuzione (gestione dei risultati, ecc.) Quando infine lo acquisisce.

Dai un'occhiata all'implementazione di psycopg2 here.