Asyncio.gather vs asyncio.wait
在上篇文章已经看到多次用asyncio.gather了,还有另外一个用法是asyncio.wait,他们都可以让多个协程并发执行。那为什么提供2个方法呢?他们有什么区别,适用场景是怎么样的呢?其实我之前也是有点困惑,直到我读了asyncio的源码。我们先看2个协程的例子:
async def a():
print('Suspending a')
await asyncio.sleep(3)
print('Resuming a')
return 'A'
async def b():
print('Suspending b')
await asyncio.sleep(1)
print('Resuming b')
return 'B'
在IPython里面用gather执行一下:
In : return_value_a, return_value_b = await asyncio.gather(a(), b())
Suspending a
Suspending b
Resuming b
Resuming a
In : return_value_a, return_value_b
Out: ('A', 'B')
Ok,asyncio.gather方法的名字说明了它的用途,gather的意思是「搜集」,也就是能够收集协程的结果,而且要注意,它会按输入协程的顺序保存的对应协程的执行结果。
接着我们说asyncio.await,先执行一下:
In : done, pending = await asyncio.wait([a(), b()])
Suspending b
Suspending a
Resuming b
Resuming a
In : done
Out:
{:1> result='A'>,
:8> result='B'>}
In : pending
Out: set()
In : task = list(done)[0]
In : task
Out: :8> result='B'>
In : task.resul