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
相关产品推荐
相关产品推荐

