8

Pythonスレッドに譲歩するように指示したいので、CPUを不必要に占有しないようにします。Javaでは、関数を使用してそれを行うことができますThread.yield()。Pythonには似たようなものはないと思うので、time.sleep(t)whereを使用していt = 0.00001ます。t=0効果がないようです。

Pythonのスレッドモデルについて正しく理解していないことがあるかもしれません。そのため、が欠落している理由がありthread.yield()ます。誰かが私にこれを明確にすることができますか?ありがとう!

PS:これはJavaのドキュメントがThread.yield()言っていることです:

現在実行中のスレッドオブジェクトを一時的に一時停止し、他のスレッドの実行を許可します。

4

3 に答える 3

11

Dup of: threading.Thread は Python で残りのクォンタムをどのように生成しますか? .

time.sleep(0)
于 2009-12-15T15:38:13.440 に答える
4

インタープリターは、ユーザーの介入なしに、あるスレッドから別のスレッドに定期的に切り替えます。スレッドを「独り占め」しないようにシステムに指示する必要はありません。

ただし、通常の状況では、一度に実行される Python スレッドは 1 つだけです。(例外は、スレッドがハードディスクやネットワークなどの外部デバイスからの入力を待機しているときに発生する傾向があります。) これはGlobal Interpreter Lockによるものです。ただしこれは、Java や他の多くの言語の場合ほど Python のスレッドから得られるメリットが少ないことを意味します。可能であれば、マルチスレッドの代わりにマルチプロセッシングに移行することは 1 つの良い方法ですが、この問題を回避することは必ずしも簡単ではありません。

ただし、やりたいことはある意味で欠陥があるようです.2つのスレッドがあり、両方に作業がある場合、それらを切り替えるためにアプリケーション側のコードを書く必要はありません。それは、オペレーティング システムまたは仮想マシンの仕事です。プロセッサ時間の点で別のスレッドを優先したいために、あるスレッドに「実行量を減らす」ように指示していることに気付いた場合は、任意の譲歩やスリープを追加するのではなく、代わりにスレッドの優先順位を設定する必要があります。(繰り返しになりますが、グローバル インタープリター ロックが存在することを考えると、これは Python ではあまり意味がないかもしれません。)

于 2009-12-15T15:43:41.543 に答える
0

Thread.yield() が Python にないのは、忘れられているか、設計者がすべての同期とプロセス間通信の問題を Thread.yield() なしで解決できると考えていたためです。

次の問題には Thread.yield() を使用します。

たとえば、ジョブ キューがあり、ジョブ キューからエントリを取得してエントリをジョブ キューに配置できる 2 つのワーカー スレッドがあります。これを解決する 1 つの方法は、threading.Condition クラスを使用することです。ワーカー 'B' がキュー エントリを取得したいが、キューが空である場合、待機状態になります (Condition.wait())。ワーカー「A」がキューにエントリを配置すると、ワーカー「B」が起動されます (Condition.notify())。ワーカー 'A' がここで譲歩しない場合、ワーカー 'A' はウェイクアップされたワーカー 'B' の前にタスクを取得でき、競合状態の問題が発生するため、この時点で譲歩が不可欠です。

Thread.yield() なしでどのように解決できるのだろうか。

于 2016-07-09T09:00:19.160 に答える