чем дольше работает моя программа, тем более неточным будет таймер.
Так, например, при ожидании задержки 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()