Вопрос по sleep, python, wait, performance – Python time.sleep vs занятого ожидания ожидания

9

Я играл с функцией time.sleep из python 'стандартную библиотеку и обнаружил, что она не подходит для задержек до мс. После тестирования я обнаружил, что ожидание 1 мс составляет 1,1-1,2 мс. Реализация занятого ожидания получила точность с точностью до 1%. Я использовал:

def busy_wait(dt):   
    current_time = time.time()
    while (time.time() < current_time+dt):
        pass

и может опуститься до 0,0001 секунды, прежде чем сломать 1% точности.

Основные вопросы, которые у меня есть:

Почему функция сна настолько неточна (возможно, проблема С)? Изменит ли это улучшение процессора с более высокой тактовой частотой?Зачем кому-то спать? Единственное преимущество, которое я вижу, энергосбережение, ограничено встроенными системами, не так ли?Было бы целесообразно компенсировать сон "неточность с калибровкой? Вот так:
def sleep(dt):
    sleep(calibration_function(dt))

Как в стороне, я читал, что сон неt даже хорошо работают с длительным временем ожидания:Верхний предел в Python time.sleep ()? Я также где-то читал о том, как сделать цикл с более короткими временными интервалами для повышения точности, но это бесполезно, когда я хочу задержать 0,01 сек.Карл Войтланд упоминает использование ctypes ' Nanosleep, но я чувствую, что это излишне и это время. Сон должен сделать этопредполагаемое поведение.

time.sleep - это сломанная функция Python? Или никто не заботится о точном измерении времени?

@JDong: занятое ожидание не лучше в общем случае, потому что ОС может выгрузить вашу программу нав любой момент, Таким образом, любая стратегия сна под солнцем может быть произвольно плохой в зависимости от загрузки процессора и непостоянства планировщика. Kevin
занятое ожидание отнимает процессорное время и блокирует процессор. Сон переключает контекст и незаблокировать другое выполнениеблок» ваше исполнение). В общем, вы заняты только ожиданием, если вам действительно нужно точное время, и даже тогда выпо-прежнему ограничены потребностями ОС в процессоре, который в любом случае может вас окружить ... g19fanatic
возможный дубликатНасколько точен питон?s time.sleep ()? g19fanatic
Да, я подумал, что это был вызов ОС, но теперь яМне интересно, почему они используют вызов ОС, когда занятое ожидание лучше. JDong

Ваш Ответ

2   ответа
0

но яЯ постараюсь ответить здесь, так или иначе, в меру своих возможностей.

Функция сна - это вызов ОС, который отличается от ожидания ожидания тем, чтозаблокировать поток. Если у вас есть многопоточный скрипт, он не долженТ блокировать другие темы. Функция сна является неточной в Windows, потому что это не ОС реального времени (не знаю, что это значит). Если вы строго следите за точностью ожидания, вам стоит заняться занятым ожиданием. Иначе,time.sleep() вероятно, предпочтительнее. Причина, по которой вызов ОС в спящий режим является неточным, возможно, заключается в том, что он полагается на то, что ОС вернется в нужное время, и зависит от точности ОС.планировщик

6

В Windows функция Sleep OS (которую обязательно использует Python) может пробуждать поток только кратно текущему интервалу таймера. Обычно это колеблется от 1,0 мс до 15,6 мс. Снижение интервала таймера может быть удобно, потому что это позволяет более короткий сон, но это тратит электроэнергию, как я писал в этой статье:

http://randomascii.wordpress.com/2013/07/08/windows-timer-resolution-megawatts-wasted/

Оживленное ожидание может дать лучшую точность, но, как правило, это ужасная идея, поскольку она тратит еще больше электроэнергии и отнимает время ЦП из более достойных задач:

https://randomascii.wordpress.com/2012/06/05/in-praise-of-idleness/

Наконец, точность ожидания занятости будет зависеть от того, какую функцию таймера вы используете для получения текущего времени, а также может зависеть от интервала таймера:

https://randomascii.wordpress.com/2013/05/09/timegettime-versus-gettickcount/

Почему вы хотите спать в течение таких коротких периодов времени? Обычно было бы лучше подождать, пока что-то произойдет, - ожидать события - а не ждать таких коротких периодов времени.

На самом деле Pythontime.sleep() используетWaitForSingleObject() вызов с тайм-аутом, чтобы перехватить любой Ctrl-C во время ожидания (черезSetConsoleCtrlHandler() который сигнализирует о событии.) schlenk
Приложение является своего рода макросом; У меня есть набор действий, которые я хочу симулировать очень точно. Я'мы узнали, как это сделать в C, но еще не нашли каноническое решение в Python. Мой вопрос немного не отвечает, поэтому я сейчас приму ваш ответ. Спасибо за понимание. JDong
@schlenk Спасибо за информацию о реализации time.sleep (). Правила о том, когда истекает время ожидания, в основном те же, что и для Sleep () (потому что планировщик запускается только когда что-то происходит или когда срабатывает прерывание таймера), поэтому ответ по-прежнему применяется. Bruce Dawson

Похожие вопросы