Python - точное время - PullRequest
0 голосов
/ 24 мая 2018

Я работаю над проектом, точный таймер которого действительно важен.Я работаю на python и использую функцию timer.sleep().

Я заметил, что функция timer.sleep() добавит дополнительную задержку из-за проблемы с расписанием (см. timer.sleep docs ).Из-за этой проблемы, чем дольше работает моя программа, тем более неточным является таймер.

Есть ли более точный таймер / тикер для сна программы или решения этой проблемы?

Буду признателен за любую помощь.Приветствия.

Ответы [ 3 ]

0 голосов
/ 24 мая 2018

У меня было решение, подобное приведенному выше, но оно очень быстро загружалось процессором.Вот нагруженная процессором идея и обходной путь.

def processor_heavy_sleep(ms):  # fine for ms, starts to work the computer hard in second range.
    start = time.clock()
    end = start + ms /1000.
    while time.clock() < end:
        continue
    return start, time.clock()


def efficient_sleep(secs, expected_inaccuracy=0.5):  # for longer times
    start = time.clock()
    end = secs + start
    time.sleep(secs - expected_inaccuracy)
    while time.clock() < end:
        continue
    return start, time.clock()

вывод efficient_sleep(5, 0.5) 3 раза был:

  • (3.1999303695151594e-07, 5.0000003199930365)
  • (5.00005983869791, 10.00005983869791)
  • (10.000092477987678, 15.000092477987678)

Это на окнах.Я бегу за 100 петель прямо сейчас.Вот результаты.

  • (485,003749358414, 490,003749358414)
  • (490,0037919174879, 495,0037922374809)
  • (495,00382903668014, 500,00382903668014)
0 голосов
/ 24 мая 2018

чем дольше работает моя программа, тем более неточным будет таймер.

Так, например, при ожидании задержки 0,5 с, это будет time.sleep (0,5 - (start-end)),Но все еще не решил проблему

Похоже, вы жалуетесь на два эффекта: 1) тот факт, что timer.sleep() может занять больше времени, чем вы ожидаете, и 2) внутренняя ошибка при использованиисерия звонков timer.sleep().

С первым ничего не поделаешь, кроме перехода на ОС реального времени.Базовые вызовы ОС определены как спящие на не менее , пока запрашивается.Они только гарантируют, что вы не проснетесь рано;они не гарантируют, что вы не проснетесь поздно.

Что касается второго, вам следует рассчитывать время вашего сна в соответствии с неизменной эпохой, а не временем вашего пробуждения.Например:

import time
import random

start = time.time()
ticker = 0
def myticker():
    # Sleep for 0.5s between tasks, with no creep
    global ticker
    ticker += 1
    now = time.time()
    target = start + ticker * 0.5
    if target > now:
        time.sleep(target - now)


def main():
    previous = time.time()
    for _ in range(100):
        now = time.time()
        print(now - previous)
        previous = now
        # simulate some work
        time.sleep(random.random() / 10)  # Always < tick frequency
        # time.sleep(random.random())     # Not always < tick frequency
        myticker()

if __name__ == "__main__":
    main()
0 голосов
/ 24 мая 2018

Работая в Linux с нулевым знанием Windows, я могу быть здесь наивным, но есть ли какая-то причина, по которой написание вашей собственной функции сна не будет работать для вас?
Что-то вроде:

import time

def sleep_time():
    start_time = time.time()
    while (time.time() - start_time) < 0.0001:
        continue

end_time = time.time() + 60 # run for a minute
cnt = 0
while time.time() < end_time:
    cnt += 1
    print('sleeping',cnt)
    sleep_time()
    print('Awake')
print("Slept ",cnt," Times")
...