繁体   English   中英

Python:如何制作非阻塞的while循环?

[英]Python: How to make a non-blocking while-loop?

如何制作非阻塞的 while 循环? 我正在制作一个程序,使用mqtt package用我的手机控制 RGB mqtt条。 mqtt 命令应该使 Led_Desk[1] 为False但 while 循环会阻止其他所有内容,包括 mqtt-subscription。

我试过线程,异步等待,但到目前为止没有任何效果。

    while Led_Desk[1]:

        for x in range(1,255):
            GREEN.ChangeDutyCycle(round(x/2.55,1)*brightness)
            time.sleep(speed)

        for x in range(1,255):
            RED.ChangeDutyCycle(round(100-x/2.55,1)*brightness)
            time.sleep(speed)

        for x in range(1,255):
            BLUE.ChangeDutyCycle(round(x/2.55,1)*brightness)
            time.sleep(speed)

        for x in range(1,255):
            GREEN.ChangeDutyCycle(round(100-x/2.55,1)*brightness)
            time.sleep(speed)

        for x in range(1,255):
            RED.ChangeDutyCycle(round(x/2.55,1)*brightness)
            time.sleep(speed)

        for x in range(1,255):
            BLUE.ChangeDutyCycle(round(100-x/2.55,1)*brightness)
            time.sleep(speed)

一种选择是使用线程,其中每个线程处理一个 LED。 这不是一个不合理的解决方案,但可能对您要完成的任务来说太过分了。 我认为这可以通过另一种方式完成,使用 1 个线程。

import time

Leds = [[GREEN, time.clock_gettime_ns(0)], [RED, time.clock_gettime_ns(0)], [BLUE, time.clock_gettime_ns(0)]]

while Led_Desk[1]:
    now = time.clock_gettime_ns(0)
    for led in Leds:
        if led[1] + speed > now:
            led[1] = now
            led[0].ChangeDutyCycle(round(x/2.55,1)*brightness)

这里的想法是跟踪每个 LED 处于当前状态的时间。 然后不断检查这些值,当它们超过阈值时,切换它们。

您可能需要调整if语句中的逻辑和分配时间的方式,以创建您想要的闪烁模式。 但希望这足够清楚,可以作为一个起点。

此外,原始代码阻止 mqtt 订阅的原因(您可能已经想到了)是因为在单线程程序中的那些嵌套 for 循环中调用sleep将最终按顺序睡眠很多很多次。

我通过将 while 循环包装在一个线程中并定义“thread1.daemon = True”来解决它。 我不确定它到底做了什么,但它允许线程和主循环并行运行而不会阻塞。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM