ハードウェアの一部をポーリングするスレッドがあります。
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
ステートメントがありますが、それは完全に別のものです(ジェネレーターで行うため)。
ここで正しいことは何ですか?
time.sleep(0)
は、制御を行うのに十分です。正のイプシロンを使用する必要はありません。確かに、time.sleep(0)
は、「準備ができている他のスレッドに譲る」ことを意味します。
グローバルインタープリターロック(GIL)について確認します。
例: http://jessenoller.com/2009/02/01/python-threads-and-the-global-interpreter-lock/
また: http://www.pyzine.com/Issue001/Section_Articles/article_ThreadingGlobalInterpreter.html
Busy Waitingを実行する必要がある場合は、コードでこれを実行します(デバイスのポーリングなど)。
time.sleep( 0.0001 )
これはスレッドスケジューラに譲ります。
また、私は http://homepage.mac.com/s_lott/iblog/architecture/C551260341/E20081031204203/index.html でいくつかのメモと参照を収集しました