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