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
risposta
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.
"Uno scenario specifico" Dite solo l'operazione di database più comune, selezionando elementi da una tabella? –
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.
- 1. Python: contesto GIL - commutazione
- 2. Thread Python e GIL
- 3. Cosa significa x [x <2] = 0 in Python?
- 4. Python cursori psycopg2
- 5. Timeout psycopg2 Python
- 6. python 'x giorni fa' a datetime
- 7. Python GIL è veramente per interprete?
- 8. Come supera un server web Python GIL
- 9. Python 2.x valori restituiti per cmp
- 10. Prepararsi a convertire da Python 2.x a 3.x
- 11. Cosa fa "12345" + 2 fa in C?
- 12. Cosa fa var x = x || {};
- 13. Come utilizzare le estensioni C in python per aggirare GIL
- 14. Get ActionBarSherlock actionBarSize in Android 2.x
- 15. uno script python può essere eseguito sia con python 2.x sia con python 3.x
- 16. nltk.download() si blocca su OS X
- 17. corrispondenza dell'istogramma di due immagini in Python 2.x?
- 18. Dov'è il GIL in PyPy?
- 19. Problemi con l'installazione di psycopg2/percorso Python
- 20. Il supporto Psycopg2 Python SSL non è compilato in
- 21. Come installare psycopg2 per Python 3.5
- 22. Come scrivere Python 2.x quanto più compatibile con Python 3.x possibile?
- 23. Come usare pip con Python 3.x insieme a Python 2.x
- 24. Come analizzare Python 2.x con Python 3.x ast module?
- 25. Jython ha il GIL?
- 26. In Python Dizionari, come fa ((j * 5) +1)% 2 ** I cicla tutto 2 ** i
- 27. Installa psycopg2 su Ubuntu
- 28. psycopg2: Come eseguire query postgresql sotto vuoto in script python
- 29. psycopg2 su Fedora
- 30. Perché math.factorial è molto più lento in Python 2.x rispetto a 3.x?
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. –