我有一段时间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
我认为你在正确的轨道上,我的答案基本上是建议存储循环前的时间,并在最后“填充”剩余时间。非常类似于你在做什么。 –