Джаррет Харди уже упомянул это : Согласно Гвидо ван Россум , лучшего способа на данный момент нет: как указано в документации , join(None)
блоки (и это означает, что нет сигналов). Альтернатива - вызов с огромным таймаутом (join(2**31)
или около того) и проверка isAlive
выглядит великолепно. Однако то, как Python обрабатывает таймеры, губительно, как видно при запуске программы тестирования python с servth.join(100)
вместо servth.join()
:
select(0, NULL, NULL, NULL, {0, 1000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 2000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 4000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 8000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 16000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 32000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
select(0, NULL, NULL, NULL, {0, 50000}) = 0 (Timeout)
--- Skipped 15 equal lines ---
select(0, NULL, NULL, NULL, {0, 50000}Killing
Т.е. Python включается каждые 50 мс, что приводит к тому, что одно приложение не дает процессору спать.