TL; DR Если вы проводите опрос на событие, которое происходит раз в минуту, вы можете не проверять каждую секунду.
Да, это действительно так. Сон в потоке снижает использование ЦП в этом потоке. Пока поток спит, он почти не потребляет процессорного времени.
Да, это верно для практически любого языка, если спящий режим реализован с использованием собственного API потоковой обработки.
Думать об этом интуитивно, давайте рассмотрим упрощенную версию программы из связанного вопроса:
while end_condition_expression:
if time_based_condition_expression:
do_something()
Теперь, давайте упрощать мир, и предположим, что программа является единственным процессом, запущенным на процессор.
Предположим также, что временное условие истинно раз в минуту. Предположим также, что выполнение end_condition_expression
и time_based_condition_expression
стоит 10 nano секунд времени процессора.
Сколько времени будет потреблять процессор в течение минуты? Ровно одна минута == 60 000 000 000 nano секунд. Использование процессора будет 100% в течение всего времени. Цикл будет повторяться шесть миллиардов раз.
Теперь рассмотрит этот вариант программы:
while end_condition_expression:
if time_based_condition_expression:
do_something()
sleep_for_a_second()
Сколько раз цикл произведет в течение одной минуты? 60 итераций. Сколько времени процессор будет потреблять в течение минуты? 60 * 10 ns = 600 ns. Это сто миллионная часть того, что использовала не-спальная версия программы.
В действительности, из вызова в сон есть немного накладных расходов, а время процессора совместно используется другими процессами, и задействован планировщик, а точное использование процессора не будет точно соответствовать моим предположениям, но идея остается прежней.
Добавление сна в цикл обычно означает, что есть проблема с логикой программы, но да, это помогает плохому коду. – NathanOliver
Что делать, если вы хотите, чтобы программа работала вечно, пока она ждет прерывания? Есть ли лучшая альтернатива? – dashiell
Если цикл while предназначен только для ожидания какого-либо внешнего события, его нужно заменить каким-то многопоточным инструментом, предназначенным для ожидания события. Если он опросит диск для файла, тогда спят, тогда проверка, вероятно, является лучшим вариантом. Но просто сжигание в действительных инструкциях cpu, таких как while (true), - это самый худший способ дождаться события. Есть ли лучший способ ... зависит от того, какое событие вы ожидаете. –