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

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())

关键改动说明

  1. 启动事件循环:用uasyncio.run(main())启动事件循环,这是MicroPython中uasyncio的标准启动方式,所有异步任务都要在事件循环中才能被调度执行。
  2. 替换阻塞睡眠:把utime.sleep(3)换成await uasyncio.sleep(3),异步睡眠不会卡住整个程序,事件循环在这段时间里可以正常调度你的_while_loop任务。
  3. 等待任务收尾:最后加的await uasyncio.sleep(0.2)是让程序多等一会儿,确保_while_loop能处理到should_run的变化,彻底停止循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 08:05:34