2011-08-10 20 views
0

Python条件変数にwait()を呼び出すと、呼び出しスレッドは実行と保留を中断しますか、または次のコンテキスト切り替えまでブロックされ続けますか?それは通知()、または別のスレッドで同じ条件 変数のnotifyAll()呼び出しで を覚醒されるまでPythonのthreading.Condition.wait()はすぐに実行を中断しますか?

+0

私はその実装に依存していると思います。奇妙なCPythonスレッドはおそらくそうではありませんが、それはあいまいなメモリからの推測に過ぎません。 –

答えて

2

スレッドが降伏します。この降伏は、pthread_cond_waitの実装またはPyThread_acquire_lockの同等のサスペンドメカニズムによるものです。条件変数はシステムコールインタフェースを使用して実装され、Pythonはネイティブスレッドを使用するため、オペレーティングシステムスケジューラは別のスレッドへの切り替えを行います。

また、GIL is releasedをPythonの内部構造の内部に呼び出す前に。最後にパズルの最後の部分はthreading.Condition.waitでロックを取得する呼び出しです。

1

待ち()メソッドは、ロックを解除し、その後ブロック。復帰するとロックを再度取得し、 が返されます。タイムアウトを指定することもできます。

条件が通知されるまでブロックされます。

+0

それを信じて、実際にマニュアルを読むことを実際に試みました。実行を「ブロック」する場合、代わりにスピンロックを使用するのはなぜですか? –

+0

スピンロックで待機中のスレッドはCPUを消費しますが、条件で待機しているスレッドはCPUを消費しません。スピンロックは、ロックが保持され、急速に解放される場合に便利です。条件は、私たちがどれくらい待つかわからない場合に役立ちます。 –

+0

OK、つまりスレッドの利便性は? –

関連する問題