![](/img/trans.png)
[英]How to make non-blocking while loop in Python Tornado websocket to stream data
[英]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.