2016-06-23 16 views
5

私は同僚と議論を解決しようとしています。私はpsycopg2を使用してPostgresデータベースと通信するPython 2.6アプリケーションを持っているとします。アプリはマルチスレッド化されています。スレッドがpsycopg2を使用してデータベース呼び出しを行うと、他のスレッドもデータベース呼び出しを行うことができるようにGILを解放しますか?Python 2.xの `psycopg2`はGILをブロックします

+0

ソース内の[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)を試してみてください。彼らはここにそこに振りかざされて、あなたの特定のシナリオが適用されるかどうか確認してください。 –

答えて

2

the Psycopg release notesを一見すると、GILをリリースする言及がたくさんあります。だから明らかに適切なときにGILをリリースしようとします。あなたは特定のシナリオについて尋ねなかったので、より具体的な答えは可能ではないと私は考えています。

+0

「特定のシナリオ」最も一般的なデータベース操作で、テーブルから項目を選択するだけですか? –

0

あなたが言ったように、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をご覧ください。

関連する問題