5

「理解したい」という質問があります。まず、Ubuntuでpython2.6.5を使用しています。

つまり、Pythonのスレッド(スレッドモジュール経由)は単なる「スレッド」であり、GILに特定の期間などに各「スレッド」からコードブロックを実行するように指示するだけです。実際にはありません。ここに実際のスレッドがあります。

したがって、問題は、1つのスレッドにブロッキングソケットがあり、データを送信して5秒間スレッドをブロックしている場合です。sock.sendスレッドをブロックしているのは1つのCコマンド()であるため、すべてのプログラムをブロックすることを期待していました。しかし、メインスレッドが引き続き実行されているのを見て驚いた。したがって、問題は、GILがsendなどのブロッキングコマンドに到達した後、残りのコードをどのように続行して実行できるかということです。ここでは本物の糸を使わなくてはいけませんか?

ありがとう。

4

3 に答える 3

12

Pythonは「実際の」スレッド、つまり基盤となるプラットフォームのスレッドを使用します。Linuxでは、pthreadライブラリを使用します(興味がある場合は、ここに実装があります)。

Pythonのスレッドの特別な点はGILです。スレッドはこのグローバルロックを保持している場合にのみPythonデータ構造を変更できます。したがって、多くのPython操作では、複数のプロセッサコアを利用できません。ただし、ブロッキングソケットを持つスレッドは、GILを保持しないため、他のスレッドには影響しません。

GILは誤解されることが多く、Pythonではスレッドはほとんど役に立たないと人々に信じ込ませています。GILが防ぐ唯一のことは、複数のプロセッサコアで「純粋な」Pythonコードを同時に実行することです。スレッドを使用してGUIをレスポンシブにしたり、I / Oのブロック中に他のコードを実行したりする場合、GILは影響しません。スレッドを使用して、複数のプロセッサコアでNumPy / SciPyなどのC拡張機能のコードを同時に実行する場合、GILも影響しません。

于 2011-02-07T12:02:10.443 に答える
6

GILのPythonwikiページには次のように記載されています

I / O 、画像処理、NumPy番号の処理など、ブロックまたは長時間実行される可能性のある操作は、GILの外部で発生することに注意してください。

于 2011-02-07T11:30:43.203 に答える
5

GIL(グローバルインタープリターロック)は単なるロックであり、それ自体では何も実行されません。むしろ、Pythonインタープリターは、必要に応じてそのロックをキャプチャして解放します。原則として、ロックはPythonコードの実行時に保持されますが、下位レベルの関数(などsock.send)の呼び出しに対しては解放されます。Pythonスレッドは実際のOSレベルのスレッドであるため、スレッドはPythonコードを並行して実行しませんが、1つのスレッドが長時間実行C関数を呼び出すと、GILが解放され、最初のスレッドが終了するまで別のPythonコードスレッドを実行できます。

于 2011-02-07T12:22:07.393 に答える