You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本如何同时执行LED效果更新与GET请求轮询任务

基于异步编程的树莓派灯带控制实现方案

你选定的异步编程方向完全适配这个场景,核心逻辑是把高时序要求的LED刷新、低实时性的网络轮询拆成两个独立调度的任务,网络请求等待响应的过程中会主动让出CPU,不会阻塞LED按固定频率更新。

核心实现逻辑

  • 用Python标准库asyncio作为事件循环调度核心,两个任务并行运行互不干扰
  • LED刷新协程严格按10Hz间隔运行,保证灯光效果时序稳定
  • 网络轮询协程用异步HTTP客户端发请求,等待响应时不会占用CPU资源,完全不卡LED刷新
  • 两个协程通过全局变量/上下文对象传递最新的灯光配置参数,逻辑解耦

依赖安装

树莓派端先装需要的库:
pip install aiohttp rpi-ws281x

注意不要用同步的requests库发请求,同步请求会阻塞整个事件循环,还是会导致LED刷新卡顿

核心代码参考

import asyncio
import aiohttp
from rpi_ws281x import PixelStrip, Color

# 灯带硬件配置
LED_COUNT = 60        # 灯带LED数量
LED_PIN = 18          # 信号输出引脚
LED_FREQ_HZ = 800000  # 灯带通信频率
LED_DMA = 10
LED_BRIGHTNESS = 255
LED_INVERT = False
strip = PixelStrip(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
strip.begin()

# 全局状态存储,两个协程通过这里同步配置
current_config = {
    "effect": "rainbow",
    "params": {}
}

async def led_render_loop():
    """10Hz固定频率刷新灯带的协程"""
    hue = 0
    while True:
        if current_config["effect"] == "rainbow":
            # 彩虹效果颜色计算逻辑,可替换为自己的效果实现
            for i in range(LED_COUNT):
                offset_hue = (hue + i * 256 // LED_COUNT) % 256
                # 此处可替换为标准HSV转RGB的wheel函数实现更自然的彩虹效果
                strip.setPixelColor(i, Color(offset_hue, 255-offset_hue, 128))
            strip.show()
            hue = (hue + 8) % 256
        # 精准控制10Hz刷新间隔,用asyncio.sleep不会阻塞其他任务
        await asyncio.sleep(0.1)

async def server_poll_loop():
    """轮询远端服务器拉取最新灯光配置的协程"""
    async with aiohttp.ClientSession() as session:
        while True:
            try:
                async with session.get("你的PythonAnywhere服务接口地址") as resp:
                    if resp.status == 200:
                        new_config = await resp.json()
                        current_config["effect"] = new_config.get("effect", "rainbow")
                        current_config["params"] = new_config.get("params", {})
            except Exception:
                # 请求超时、报错直接跳过,等下次轮询重试即可,不影响灯带正常运行
                pass
            # 轮询间隔设为2秒即可,既不会有明显控制延迟,也不会触发PythonAnywhere的请求频率限制
            await asyncio.sleep(2)

async def main():
    # 两个任务并行加入事件循环运行
    await asyncio.gather(
        led_render_loop(),
        server_poll_loop()
    )

if __name__ == "__main__":
    asyncio.run(main())

注意事项

  • 所有协程内的等待逻辑都要用asyncio对应的异步方法,禁止用time.sleep()这类阻塞式方法,否则会破坏时序
  • 轮询间隔不要设太短,PythonAnywhere免费版对请求频率有阈值限制,1-3秒的间隔完全满足家用控制的实时性要求
  • 后续新增灯光效果只需要在led_render_loop里新增对应效果的渲染分支即可,不会影响轮询任务的正常运行

内容的提问来源于stack exchange,提问作者regerogarc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.09 16:15:44