2016-08-01 66 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%的错误...

有没有办法做到这一点,以良好的精度?

回答

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())) 

现在你不会得到任何漂移,因为时间步长是从开始时间牢固地设置值。以前在设置now = time.time()之前发生的小计算会导致一个小漂移,但现在只要您的time_step足够长以执行s.sendto(...)命令,就不应该有任何漂移。