python - 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)
解决方案
(免责声明:不知道微蟒)
异步程序基于所谓的合作调度。协程/任务只能在某些点切换。这些点是await
代码中的 s。
如果await
协程中没有,则任务切换是不可能的,即没有其他协程有机会运行。的情况就是这样InvPress
。(其他协程没有完整列出)
与之密切相关的是规则,在异步程序中定期休眠是一个错误。它除了睡眠之外什么都不做,并阻止其他协程在这段时间内运行。在这种睡眠期间,程序只是死了(无响应)。如果需要延迟,请始终await
使用正确的异步睡眠程序。
推荐阅读
- c++ - Char, unsigned char 和signed char as char&
- html - 隐藏的显示属性不适用于段落标签
- typescript - Firebase Cloud Functions - 获取类型错误:无法读取未定义的属性“地图”
- c++ - 输出不是预期的
- java - Eclipse org.eclipse.core.resources java.lang.NoClassDefFoundError: sun/misc/BASE64Encoder
- android - 多个用户如何使用 firebase 在 android 中登录他们各自的活动
- node.js - 多阶段构建删除先前阶段的目录?
- python - 在 Dataflow 作业中查找重复项 - Python
- java - 通过 Youtube v3 下载 youtube 隐藏式字幕的方法是什么?
- r - R - 是否可以在没有数据的情况下保存模型定义?