是否有使用绝对定时的python睡眠函数?



我想以时间依赖的方式运行一些物理设备,我的程序需要与外部进程同步,因此准确性很重要。我需要运行的代码非常简单,但我必须在两者之间等待,我的第一个方法是:

import serial
import time
device = serial.Serial('COM3')
while True:
device.write(command)
time.sleep(30)

但是我想要一个循环花费30秒,不包括代码执行,我能想到的最好的方法是这样的:

start = time.time()
cycle = 1
while True:
device.write(command)
while start + cycle*30 < time.time():
sleep(0.5) 

但是这感觉不是一个很好的方法。有没有更好的办法?

你必须使用线程。我认为您希望在写入设备时运行命令而不影响同步。要做到这一点,唯一的解决方案是并行运行两个任务,怎么做?线程。

import time
import threading
command = "command"

#First Method
def write_to_device(command):
while True:
device.write(command)
time.sleep(30)

#Second Method
def do_something():
While True:
pass
# Do something


t1 = threading.Thread(target=write_to_device, args=(command,))
t2 = threading.Thread(target=do_something)

#Started the threads
t1.start()
t2.start()

#Joined the threads
t1.join()
t2.join()

最简单的解决方案是计算到下一个间隔开始的时间,并在该时间内休眠。请参阅下面的代码进行演示:

import random
import time
INTERVAL_TIME = 5.0
def some_operation():
print('Starting some operation at ' + time.strftime('%H:%M:%S'))
time.sleep(3.0 * random.random())
print('Finished the operation.')
next_time = time.time()
while True:
next_time += INTERVAL_TIME
some_operation()
time.sleep(next_time - time.time())

注意,如果操作需要的时间比间隔时间长,则必须决定如何处理它。睡眠时间过长是不可能的,会导致异常。但是,您可以选择立即开始下一个操作(并希望赶上时间),或者跳过操作并在下一个间隔开始。

最新更新