asynico一般都是必有2条语句
gather(*coros_or_futures, loop=None, return_exceptions=False)
# 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
run_until_complete
是一个阻塞(blocking)调用,直到协程运行结束,它才返回。这一点从函数名不难看出。
run_until_complete
的参数是一个 future,但是我们这里传给它的却是协程对象,之所以能这样,是因为它在内部做了检查,通过
ensure_future
函数把协程对象包装(wrap)成了 future。所以,我们可以写得更明显一些:
loop.run_until_complete(asyncio.ensure_future(do_some_work(3)))
回调
假如协程是一个 IO 的读操作,等它读完数据后,我们希望得到通知,以便下一步数据的处理。这一需求可以通过往 future 添加回调来实现。def done_callback(futu):
print('Done')
futu = asyncio.ensure_future(do_some_work(3))
futu.add_done_callback(done_callback)
loop.run_until_complete(futu)
多个协程
实际项目中,往往有多个协程,同时在一个 loop 里运行。为了把多个协程交给 loop,需要借助 asyncio.gather 函数。
loop.run_until_complete(asyncio.gather(do_some_work(1), do_some_work(3)))
或者先把协程存在列表里:
coros = [do_some_work(1), do_some_work(3)]
loop.run_until_complete(asyncio.gather(*coros))
参考函数 gather 的文档:
gather(*coros_or_futures, loop=None, return_exceptions=False)
Return a future aggregating results from the given coroutines or futures.
发现也可以传 futures 给它:
futus = [asyncio.ensure_future(do_some_work(1)),
asyncio.ensure_future(do_some_work(3))]
loop.run_until_complete(asyncio.gather(*futus))
gather 起聚合的作用,把多个 futures 包装成单个 future,因为 loop.run_until_complete 只接受单个 future。
asyncio.gather
和 asyncio.wait
功能相似。
1
2
|
coros
=
[
do_some_work
(
loop
,
1
)
,
do_some_work
(
loop
,
3
)
]
loop
.
run_until_complete
(
asyncio
.
wait
(
coros
)
)
|
为了稳定(方便)最好在loop.run_until_complete(task)后面跟个loop.close()