używam dość standardowy Threading.Event: Główny wątek trafia do punktu, gdzie jej w pętli, który działa:Lepsze rozwiązanie dla Pythona Threading.Event semi-zajęty czeka
event.wait(60)
innych bloków na wniosek aż post jest dostępne, a następnie inicjuje:
event.set()
Spodziewam się główny wątek, aby wybrać do 40 sekund, ale to nie jest przypadek. Od źródła 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)
Co dostajemy to wybierz syscall kursują co 500us. Powoduje to zauważalne obciążenie maszyny przy dość ciasnej pętli wyboru.
Czy ktoś mógłby wyjaśnić, dlaczego jest balansowanie zaangażowany i dlaczego jest ona inna niż nitka czeka na deskryptorze pliku.
i po drugie, czy istnieje lepszy sposób na wdrożenie głównie śpiącego wątku głównego bez tak ciasnej pętli?