私はかなり標準的な Threading.Event を使用しています: メインスレッドは、実行されるループ内のポイントに到達します:
event.wait(60)
他のブロックは、応答が利用可能になるまで要求をブロックし、次のことを開始します。
event.set()
メインスレッドが 40 秒間選択することを期待しますが、そうではありません。Python 2.7 ソース Lib/threading.py から:
# Balancing act: We can't afford a pure busy loop, so we
# have to sleep; but if we sleep the whole timeout time,
# we'll be unresponsive. The scheme here sleeps very
# little at first, longer as time goes on, but never longer
# than 20 times per second (or the timeout time remaining).
endtime = _time() + timeout
delay = 0.0005 # 500 us -> initial delay of 1 ms
while True:
gotit = waiter.acquire(0)
if gotit:
break
remaining = endtime - _time()
if remaining <= 0:
break
delay = min(delay * 2, remaining, .05)
_sleep(delay)
得られるのは、500us ごとに実行される select syscall です。これにより、選択ループが非常にタイトになり、マシンにかなりの負荷がかかります。
バランスをとる行為が含まれる理由と、それがファイル記述子を待機しているスレッドと異なる理由を説明してください。
第二に、そのようなタイトなループなしで、ほとんどスリープ状態のメインスレッドを実装するより良い方法はありますか?