2016-08-01 60 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(...)命令,就不應該有任何漂移。