首页 > 解决方案 > uasyncio 并行(多)线程似乎不起作用

问题描述

我尝试使用两个我想在同一时间连续执行的例程,但只有第一个正在运行......

我哪里错了?

 async def screen(self): #first routine
    Writer.set_textpos(ssd, 0, 0)  # In case previous tests have altered it
    wri = Writer(ssd, small, verbose=False)
    wri.set_clip(False, False, False)

    ...
        refresh(ssd)
        utime.sleep_ms(200)
    
async def InvPress(self):  #second routine
    utime.sleep_ms(1000)
    print('Sw2',self.SW2.value())
    while True:
        print(self.SW2.value())
        if self.SW2.value():
            if self.PressPos == 1:
                self.stepper.steps(-1600,2600)
                self.PressPos = not self.PressPos
            else :
                self.stepper.steps(+1600,2600)
                self.PressPos = not self.PressPos
        utime.sleep_ms(120)


async def main(self): #this don't work in parallel (only the first routine is running)
    uasyncio.create_task(self.InvPress())
    uasyncio.create_task(self.screen())       
    await uasyncio.sleep(10)

标签: pythonpython-asynciomicropython

解决方案


(免责声明:不知道微蟒)

异步程序基于所谓的合作调度。协程/任务只能在某些点切换。这些点是await代码中的 s。

如果await协程中没有,则任务切换是不可能的,即没有其他协程有机会运行。的情况就是这样InvPress。(其他协程没有完整列出)

与之密切相关的是规则,在异步程序中定期休眠是一个错误。它除了睡眠之外什么都不做,并阻止其他协程在这段时间内运行。在这种睡眠期间,程序只是死了(无响应)。如果需要延迟,请始终await使用正确的异步睡眠程序。


推荐阅读