import asyncio, time

async def a(s):
    import time
    await asyncio.sleep(1)
    print(s)

async def b():
    asyncio.ensure_future(a('asd'))
    asyncio.ensure_future(a('qwe'))
    await asyncio.sleep(2)
    print('b')

loop = asyncio.get_event_loop()
B = b()
loop.run_until_complete(B)

要注意的有几个地方:

  1. async def的函数在哪里都可以调用,但是在调用的时候,必须显式等待其结束,否则会出现RuntimeWarning: coroutine 'xxx' was never awaited。在async函数中调用async函数的话,可以使用await关键字直接阻塞等待;在非async函数中则必须设置事件循环器event looper,然后通过事件循环器对所有的异步async函数进行阻塞式等待,避免主线程在子线程完成前退出;
  2. 在协程中休眠线程不能用time.sleep(),而应该用asyncio.sleep(),否则休眠的是整个进程而不是目标协程;
  3. asyncio.ensure_future()比较有意思,提供了类似“用完就扔”的协程运行模式,不必在后续显式await该协程。

标签: none

添加新评论