2016-08-01 1 views
2

일정한 간격으로 여러 번 작업을 반복하고 싶습니다.이 작업을 일정한 방식으로 수행하고 싶습니다. 1 초에 4 번 작업을하고 싶습니다. t = 0, 0.25, 0.5 및 0.75에서 실행될 수있다. 지금 내가 뭐하는 거지 그래서동작을 t 초 동안 x 번 반복 실행

:

import math 
import socket 

s = socket.socket(...) #not important 

time_step = 1./num_times_executed 
for _ in num_times_executed: 
    now = time.time() 
    s.sendto(...) #action i do 
    time.sleep(max(0,time_step-(time.time()-now))) 

그러나 많은 오버 헤드가, 더 큰 루프는 내가 얻을 더 드리프트입니다. 예를 들어 num_times_executed = 800 일 경우 1.1 초 걸리므로 10 % ~ 10 %가 잘못됩니다 ...

좋은 정밀도로이를 수행 할 수있는 방법이 있습니까?

답변

2
time_step = 1./num_times_executed 
start = time.time() 
for i in num_times_executed: 
    s.sendto(...) #action i do 
    next_send_time = start + (i+1) * time_step 
    time.sleep(max(0,next_send_time - time.time())) 

시간 단계가 시작 시간 값으로 설정되어 있기 때문에 드리프트가 발생하지 않습니다. 이전에는 time.time()을 설정하기 전에 약간의 계산이 발생했지만 작은 드리프트가 발생했지만 time_step이 s.sendto (...) 명령을 실행하기에 충분히 길면 드리프트가 없어야합니다. .

관련 문제