如何在 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节

https://docs.python.org/3/tutorial/controlflow.html

我假设你是 运行 一个这样的循环:

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。