如何在 Python 中 运行 时中断函数
How to interrupt a function while running in Python
我正在对几个 LED 进行编程,以制作 Philips Hue 或 LIFX 的克隆版作为初学者项目以满足个人需求。我的目标是更多地了解硬件和软件。我已经编写了一些可以完美运行的代码,但是我有一个函数需要更多时间来检查所有颜色。我怎样才能从 运行 中断它,以便我可以处理我收到的客户端请求(在本例中是我计算机上的 python 脚本 运行)?我有一个 esp8266 作为服务器。这段代码在微控制器上运行。我尝试使用 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()
祝你的初学者项目好运。
你的意思是停止控制流(循环)?如果是,请检查 "break" 选项。
详情请参考下文link中的4.4节
我假设你是 运行 一个这样的循环:
while True:
data = s.recv(BUFFER_SIZE)
if data:
handle_data(data)
如果 handle_data 不会阻塞循环太久,那是有效的。但是如果你的色轮需要几秒钟,那么这段时间是收不到数据的。
您可以将句柄数据实现为 return 生成器,并对其进行迭代:
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。
我正在对几个 LED 进行编程,以制作 Philips Hue 或 LIFX 的克隆版作为初学者项目以满足个人需求。我的目标是更多地了解硬件和软件。我已经编写了一些可以完美运行的代码,但是我有一个函数需要更多时间来检查所有颜色。我怎样才能从 运行 中断它,以便我可以处理我收到的客户端请求(在本例中是我计算机上的 python 脚本 运行)?我有一个 esp8266 作为服务器。这段代码在微控制器上运行。我尝试使用 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()
祝你的初学者项目好运。
你的意思是停止控制流(循环)?如果是,请检查 "break" 选项。
详情请参考下文link中的4.4节
我假设你是 运行 一个这样的循环:
while True:
data = s.recv(BUFFER_SIZE)
if data:
handle_data(data)
如果 handle_data 不会阻塞循环太久,那是有效的。但是如果你的色轮需要几秒钟,那么这段时间是收不到数据的。 您可以将句柄数据实现为 return 生成器,并对其进行迭代:
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。