python - 如何在Python中运行时中断函数

标签 python python-3.x function interrupt micropython

我正在对几个 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/

相关文章:

python-3.x - 如何更改 altair 中 geo_shape 的限制(python vega-lite)

python - 将相同的参数传递给多个函数 - Python

javascript - 字符串插值。找到与 [...] 内的字符串匹配的对象 prop 并替换为 prop 的值

python - 如何在 Pandas 上按键转置数据框组?

python - 清理没有 .join() 且不阻塞主线程的线程

python - 根据密码对字符串进行编码的简单方法?

python - 从列表中随机选择时如何在字符串中使用变量?

python - 可以将输入字符串转换为 Python 中的可调用函数对象吗?

python - 无法使用发布请求从网页中获取某些内容

python - 获取file1的相对路径(相对于file2的路径,file1在file2的子文件夹中)