私は同僚と議論を解決しようとしています。私はpsycopg2
を使用してPostgresデータベースと通信するPython 2.6アプリケーションを持っているとします。アプリはマルチスレッド化されています。スレッドがpsycopg2
を使用してデータベース呼び出しを行うと、他のスレッドもデータベース呼び出しを行うことができるようにGILを解放しますか?Python 2.xの `psycopg2`はGILをブロックします
答えて
the Psycopg release notesを一見すると、GILをリリースする言及がたくさんあります。だから明らかに適切なときにGILをリリースしようとします。あなたは特定のシナリオについて尋ねなかったので、より具体的な答えは可能ではないと私は考えています。
「特定のシナリオ」最も一般的なデータベース操作で、テーブルから項目を選択するだけですか? –
あなたが言ったように、GILを取得したスレッドだけがPythonオブジェクトで動作したり、Python/C API関数を呼び出したりするというルールが存在します。実行の並行性をエミュレートするために、Pythonインタプリタは定期的にスレッドを切り替えようとします。ロックは、ファイルの読み取りや書き込みなどのI/O操作をブロックする可能性があるため、他のPythonスレッドがその間に実行できるように、解放されます。
ほとんどの拡張コード(psycopg2のコードが含まれています)GILを操作すると、以下のような簡単な構造を有する:これは、ブロッキングI/O操作(例えば、Postgresのからのネットワーク応答を待っている)が発生したときにことを意味
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.
をGILは解放され、他のスレッドは実行を続けることができます。ブロッキングI/O操作が完了すると、スレッドはGILを取得しようとし、最後にGILを取得すると実行(処理結果など)を続けます。
psycopg2の実装hereをご覧ください。
- 1. pickle.dumpはGILのためにマルチスレッドのPythonアプリケーションのメインスレッドをブロックします
- 2. ScikitsはPython GILをリリースしますか?
- 3. zlibモジュールはPython 3でグローバルインタプリタロック(GIL)をリリースしますか?
- 4. GIL I/O操作でスレッドがブロックされたときに、Pythonはスレッドを同時に実行しますか?
- 5. Python Psycopg2 cursor.execute returnedなし
- 6. Python 2.x - > Python 3.xのアップグレード
- 7. psycopg2のインストールosx 10.12 python 3.5.2 - psycopg2の構築に失敗しました
- 8. GILに関してpython dictのlen()はアトミックですか?
- 9. python WebサーバーはGILをどのように克服しますか
- 10. 異なるスレッドとGIL上のPythonコールバック
- 11. Python psycopg2構文エラー
- 12. Mac OS X Lion Psycopg2:シンボルが見つかりません:_PQbackendPID
- 13. Python非同期トランザクションpsycopg2
- 14. boost :: gil :: color_converted_viewとboost :: gil :: for_each_pixelの使用
- 15. Xcode 4.1のクリーンOS X Lionにpsycopg2をインストールするには
- 16. asyncioはGILを考慮してスレッドセーフではありません。
- 17. Python/psycopg2 SELECT WHERE内のエラー
- 18. Python/psycopg2のグレースフルプライマリキーエラー処理
- 19. python 3用psycopg2のインストール
- 20. Python 2.x sorted puzzlement
- 21. 3.xと2.xでのPython HMAC /エンコーディング
- 22. psycopg2.ErrorがPythonのtry/exceptブロックで捕捉されていない
- 23. Psycopg2 + Python 2 cursor.mogrifyでUnicodeデコードエラーが発生する
- 24. /?p = x構造のWordPress URLをリダイレクト/ブロックします。例えば。 site.com/?p=2
- 25. Proxy ScrapperをPython 2.xからPython 3.xに変換する
- 26. Postgres Pythonクエリインポートpg vsインポートpsycopg2
- 27. Rubyグローバルインタープリタロック(GIL) - rb_thread_call_without_gvl
- 28. Pandas、Concurrent.Futures and GIL
- 29. Python 2.x - WindowsのQueryPerformanceCounter()
- 30. Python GILをCモジュールでバイパスすることはできますか?
ソース内の[Py_BEGIN_ALLOW_THREADS'または 'PyEval_Save_Thread'](https://github.com/psycopg/psycopg2/search?utf8=%E2%9C%93&q=py_begin_allow_threads+OR+pyeval_save_thread&type=Code)を試してみてください。彼らはここにそこに振りかざされて、あなたの特定のシナリオが適用されるかどうか確認してください。 –