Лучшее решение для полузанятого ожидания Python 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)

Мы получаем системный вызов select, запускаемый каждые 500 мкс. Это вызывает заметную нагрузку на машину с довольно плотным циклом выбора.

Может кто-нибудь объяснить, почему здесь задействован балансирующий акт и чем он отличается от потока, ожидающего файлового дескриптора.

и, во-вторых, есть ли лучший способ реализовать в основном спящий основной поток без такого жесткого цикла?

7
задан iammichael 24 May 2016 в 18:33
поделиться