Admin
使用协程工具 asyncio、aiohttp、aiofile 等相关接口时,在异步逻辑中,不可避免的经常使用 await 关键字。于此同时, await 关键字所在的方法也必须是 async 关键字声明的异步方法。例如:
async def req_async():""" request with aiohttp """url = '127.0.0.1'content = 'hello'async with aiohttp.ClientSession() as session:async with session.post(url=url, data=content) as resp:if resp.status != 200:raise Exception(f'request error code: {resp.status}')return await resp.text()async def level1_call():""" do some business """await reqasync()async def level0_call():""" do some business """await level1_call()
这样,就导致了调用过程的向上传染,如果最顶层方法与异步调用兼容就会出现问题,例如:@pyqtSlot() 装饰的槽函数,如果函数是 async 关键字定义的异步函数,就不能正确触发。
@pyqtSlot()def button_clicked():loop = asyncio.get_event_loop()asyncio.ensure_future(req_async(), loop=loop)
@pyqtSlot()def button_clicked():loop = asyncio.get_event_loop()svc = TTSService()tasks = [svc.req_async()]loop.run_until_complete(asyncio.wait(tasks))