web-dev-qa-db-ja.com

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

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

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ステートメントがありますが、それは完全に別のものです(ジェネレーターで行うため)。

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

43
Tom Future

time.sleep(0)は、制御を行うのに十分です。正のイプシロンを使用する必要はありません。確かに、time.sleep(0)は、「準備ができている他のスレッドに譲る」ことを意味します。

70
Alex Martelli

グローバルインタープリターロック(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 でいくつかのメモと参照を収集しました

13
S.Lott

* nixでこれを実行している場合は、 select ライブラリが便利なことがあります。 カマエラ にも役立つコンポーネントがいくつかありますが、パラダイムの変更が少し必要になる場合があります。

4
Jason Baker