Python - time.sleep 的替代品

Posted

技术标签:

【中文标题】Python - time.sleep 的替代品【英文标题】:Python - Alternative to time.sleep 【发布时间】:2018-08-27 15:57:09 【问题描述】:

你好,有没有 time.sleep 的替代品? 因为我想让我的 LED 以准确的赫兹频率闪烁,这是因为调用 time.sleep 也需要时间,所以闪烁需要比预期更多的时间。

#!/usr/bin/python
    import RPi.GPIO as GPIO
    import time
    from threading import Thread

    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(32, GPIO.IN)

    def blink(port, hz):
        GPIO.setup(port, GPIO.OUT)
        while True:
            if GPIO.input(32) == 1:                 //lever activated?
                GPIO.output(port, GPIO.HIGH)
                time.sleep(0.5/hz)
                GPIO.output(port, GPIO.LOW)
                time.sleep(0.5/hz)
            else:
                GPIO.output(port, GPIO.LOW)
    #to make it easier to add new LED
    def start(port, hz):
        Thread(target=blink, args=(port, hz)).start()
    #to add LED insert start(GPIOport, Hz)
    start(15, 2)
    start(16, 4)
    start(18, 6)
    start(22, 12)
    start(29, 24)

【问题讨论】:

这需要有多精确?因为在像 Linux 这样的抢占式多任务操作系统下运行时,您的精确度存在硬性限制...... @MatteoItalia 应该尽可能精确。 p.s.我正在使用 Raspbian Stretch Lite 在 RasPi 上运行脚本 为了尽可能精确,您必须放弃 Linux,并在计算机器周期的裸机上编写汇编代码(可能在比现代 Cortex A 更简单的机器上)。同样,这里实际需要什么样的精度? @MatteoItalia 我真的不能说,我只是被告知不要在睡眠时这样做,因为它不够精确。但我不知道有哪些方法和可用的精度水平 见***.com/a/33054922/137386 【参考方案1】:

要保持频率,请像这样使用睡眠:

time.sleep(desired_time - time.time())

这样小延迟不会累加。

dtm = time.time()
pulse = 0.5/Hz
while True:
    dtm += pulse
    time.sleep(dtm - time.time())
    # LED ON
    dtm += pulse
    time.sleep(dtm - time.time())
    # LED OFF

如果不关心确切的占空比(即开/关比),您可以简化循环:

while True:
    time.sleep(pulse)
    # LED ON
    dtm += 2*pulse
    time.sleep(dtm - time.time())
    # LED OFF

更新,停止/恢复闪烁,参见 cmets,presudocode

 pulse = 0.5/Hz
 while True:
     dtm = time.time()
     while input32 == 1:
          ... blink LEDs ...
     while not input32 == 1:
         time.sleep(0.1)

【讨论】:

现在打开控制杆时出现此错误:线程 Thread-1 中的异常:回溯(最近一次调用):文件“/usr/lib/python2.7/threading.py”,第 801 行,在 __bootstrap_inner self.run() 文件“/usr/lib/python2.7/threading.py”中,第 754 行,在运行 self.__target(*self.__args, **self.__kwargs) 文件“hz3. py",第 16 行,闪烁 time.sleep(dtm - time.time()) IOError: [Errno 22] Invalid argument @Kai 这可能意味着dtm 没有更新,时间已经过去,sleeptime 为负数。 将 dtm = time.time() 置于每个 dtm += 脉冲之上。现在可以了,谢谢! @Kai 不,请不要那样做。在开始循环之前执行一次dtm = time.time()(以及在您暂停和恢复时) 我该如何解决这个错误,我不知道

以上是关于Python - time.sleep 的替代品的主要内容,如果未能解决你的问题,请参考以下文章

Python sched替代取消所有事件

34python模块学习-time模块

python函数深入浅出 16.time.sleep()函数详解

python的time.sleep()有多准确?

Python - 准确的 time.sleep

Python 的 time.sleep()