我正在对几个 LED 进行编程,以克隆 Philips Hue 或 LIFX,以满足作为初学者项目的个人需求。我的目标是更多地了解硬件和软件。我已经编写了一些运行完美的代码,但我有一个函数需要更多时间来检查所有颜色。我怎样才能中断它的运行,以便我可以处理客户端收到的请求(在本例中是在我的计算机上运行的 python 脚本)?我有一个 esp8266 作为服务器。这段代码在微 Controller 上运行。我尝试使用 if 语句检查每个周期后是否发送了请求,但它花费的时间比我想要的要长得多。
def color_wheel(leds):
for x in range(255):
for y in range(30):
leds[y] = (255, x, 0)
leds.write()
for x in range(255):
for y in range(30):
leds[y] = (255 - x, 255, 0)
leds.write()
for x in range(255):
for y in range(30):
leds[y] = (0, 255, x)
leds.write()
for x in range(255):
for y in range(30):
leds[y] = (0, 255 - x, 255)
leds.write()
for x in range(255):
for y in range(30):
leds[y] = (x, 0, 255)
leds.write()
for x in range(255):
for y in range(30):
leds[y] = (255, 0, 255 - x)
leds.write()
最佳答案
我假设你正在运行这样的循环:
while True:
data = s.recv(BUFFER_SIZE)
if data:
handle_data(data)
如果handle_data不会阻塞循环太长时间,那么这将有效。但如果你的色轮需要几秒钟,那么这段时间内就无法接收到数据。 您可以实现句柄数据来返回生成器,并对其进行迭代:
def color_wheel():
color=[255,0,0]
for rgb, direction in [(1,1), (0,-1), (2,1), (1,-1), (0,1),(2,-1)]:
for x in range(255):
color[rgb]+=direction
yield(tuple(color)
def set_color(color):
yield(color)
def handle_data(data):
#depending on data return set_color() or color_wheel()
while True:
data = s.recv(BUFFER_SIZE)
if data:
color_gen=handle_data(data)
try:
color=next(color_gen)
except StopIteration:
#no new color
pass
finally:
for y in range(30):
leds[y] = color
leds.write()
或者,如果您想并行执行更多操作,可以使用 asyncio。
关于python - 如何在Python中运行时中断函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58933291/