Я использую довольно стандартный Threading.Event: основной поток попадает в точку, в которой он находится в цикле, который выполняется:
event.wait(60)
Другие блоки в запросе, пока не будет доступен ответ, а затем инициируетa:
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)
То, что мы получаем, это системный вызов select, запускаемый каждые 500 мкс.Это вызывает заметную нагрузку на машину с довольно узким циклом выбора.
Может кто-нибудь объяснить, почему задействован баланс и почему он отличается от потока, ожидающего дескриптор файла.
а во-вторых, есть ли лучший способ реализовать спящий основной поток без такого жесткого цикла?