47

ハードウェアの一部をポーリングしているスレッドがあります。

while not hardware_is_ready():
    pass
process_data_from_hardware()

しかし、やるべきことがあるかもしれない他のスレッド(そしてプロセス!)があります。もしそうなら、私は他のすべての命令でハードウェアをチェックするCPUを焼き尽くしたくありません。スレッドを扱ってからしばらく経ちましたが、Pythonではありませんでしたが、ほとんどのスレッドライブラリにはyield、スレッドがスケジューラに「他のスレッドにチャンスを与える」ように指示できる関数などがあると思います。

while not hardware_is_ready():
    threading.yield()          # This function doesn't exist.
process_data_from_hardware()

しかし、スレッドのドキュメントでこのようなものへの参照を見つけることができません。Pythonにはyieldステートメントがありますが、それはまったく別のものであると確信しています(ジェネレーターを使用するため)。

ここで行う正しいことは何ですか?

4

4 に答える 4

81

time.sleep(0)コントロールを生成するには十分です-正のイプシロンを使用する必要はありません。確かに、time.sleep(0)「他のスレッドの準備ができているものなら何でも譲ります」という意味です。

于 2009-04-26T04:39:41.263 に答える
14

グローバルインタプリタロック(GIL)を読んでください。

例: http: //jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/

また:http ://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html

ビジーウェイトを実行する必要がある場合(デバイスのポーリングなど)は、コードでこれを実行します。

time.sleep( 0.0001 )

これにより、スレッドスケジューラが生成されます。

また、 http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.htmlにいくつかのメモとリファレンスを集めました。

于 2009-04-24T22:31:16.740 に答える
4

* nixでこれを行う場合は、selectライブラリが役立つ場合があります。 Kamaelaには、役立つと思われるコンポーネントもいくつかありますが、パラダイムを少し変更する必要がある場合があります。

于 2009-04-25T01:37:31.847 に答える
2

の歩留まりtime.sleep(0)が十分でない理由:

私も同様の問題を抱えていましたが、最終的にtime.sleep(0)はすべてのケースで機能しませんでしたが、機能しtime.sleep(0.0001)ました。私の場合、python.orgにある標準のバニラcpythonを使用します。Cコードでのスリープ関数の実装を見ると、との呼び出しにはわずかな違いがsleep(0)ありsleep(something_other_than_null)ます。

timemodule.cでpysleepを見ると、最初のケースでそれがわかります

if (ul_millis == 0 || !_PyOS_IsMainThread()) {
  Py_BEGIN_ALLOW_THREADS
  Sleep(ul_millis);
  Py_END_ALLOW_THREADS
  break;
}

と呼ばれます。「スレッドの許可」はGILを解放します。Sleep(0)この場合、と同等ですstd::this_thread::yield()。その後、GILが再度要求されます。ゼロ以外の値を処理するコードでは、実際のスリープ/待機とは別に、PyErr_CheckSignalsへの追加の呼び出しがあります-ドキュメントに記載されているように、「シグナルがプロセスに送信されたかどうかをチェックし、送信された場合は、対応するシグナルハンドラ」。time.sleep(0)これは、ハードウェアを操作するときにaが十分でない場合がある理由を説明します。したがって、これはcpython実装側のスリップかもしれません。そしてそれがtime.sleep(0.0001)魔法のように機能する理由です。

于 2021-05-04T05:31:56.773 に答える