MicroPython中uasyncio.create_task无法运行协程的问题排查
问题分析与解决方法
你的代码核心问题有两个:
- 创建异步任务后从未启动uasyncio事件循环,异步任务根本没有执行的机会
- 使用了阻塞式的
utime.sleep(3),直接卡住整个程序,哪怕事件循环启动了也无法调度任务
修改后的代码
import uasyncio class Test: def __init__(self): pass def run_loop(self): self.should_run = 1 uasyncio.create_task(self._while_loop()) async def _while_loop(self): print("while loop") counter = 0 while self.should_run == 1: counter += 1 print(counter) await uasyncio.sleep_ms(100) def stop(self): self.should_run = 0 print("should stop now") async def main(): test = Test() test.run_loop() print("loop started.. wait..") await uasyncio.sleep(3) # 改用异步睡眠,不阻塞事件循环 print("...waited..") test.stop() # 短暂等待确保循环处理停止信号 await uasyncio.sleep(0.2) # 启动uasyncio事件循环,这是异步任务执行的前提 uasyncio.run(main())
关键改动说明
- 启动事件循环:用
uasyncio.run(main())启动事件循环,这是MicroPython中uasyncio的标准启动方式,所有异步任务都要在事件循环中才能被调度执行。 - 替换阻塞睡眠:把
utime.sleep(3)换成await uasyncio.sleep(3),异步睡眠不会卡住整个程序,事件循环在这段时间里可以正常调度你的_while_loop任务。 - 等待任务收尾:最后加的
await uasyncio.sleep(0.2)是让程序多等一会儿,确保_while_loop能处理到should_run的变化,彻底停止循环。
内容的提问来源于stack exchange,提问作者webdeb
相关产品推荐
相关产品推荐

