我有一段時間True循環向外部函數發送變量,然後使用返回的值。此發送/接收過程具有用戶可配置的頻率,可從外部.ini配置文件保存和讀取。Python中的準確睡眠/延遲while循環
我試過time.sleep(1 /頻率),但由於其他地方使用的線程數量不夠準確。例如。 60Hz的頻率(週期爲0.0166667)給出了一個'實際'的時間。休眠()週期爲〜0.0311。
我更傾向於將使用附加while循環,它比較當前時間的開始時間加上期間,如下:
EndTime = time.time() + (1/Frequency)
while time.time() - EndTime < 0:
sleep(0)
這適合我的,而真正的函數的結尾爲如下:
while True:
A = random.randint(0, 5)
B = random.randint(0, 10)
C = random.randint(0, 20)
Values = ExternalFunction.main(Variable_A = A, Variable_B = B, Variable_C = C)
Return_A = Values['A_Out']
Return_B = Values['B_Out']
Return_C = Values['C_Out']
#Updated other functions with Return_A, Return_B and Return_C
EndTime = time.time() + (1/Frequency)
while time.time() - EndTime < 0:
time.sleep(0)
我錯過了一些東西,因爲while循環的添加導致函數只執行一次。我怎樣才能讓上述功能正常工作?這是在非實時操作系統上「準確」控制頻率的最佳方法嗎?我應該使用線程來處理這個特定的組件嗎?我正在Windows 7(64位)和Ubuntu(64位)上測試此功能。
你想在給定的頻率下執行'ExternalFunction.main'嗎? –
是的,這是正確的。我過去使用過threading.timer()和apscheduler;也許這些選擇會更好?編輯:apscheduler只接受第二個整數,所以不適合毫秒精度。 – jars121
我認爲你在正確的軌道上,我的答案基本上是建議存儲循環前的時間,並在最後「填充」剩餘時間。非常類似於你在做什麼。 –