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()
本文介绍如何使用Python的asynico库来实现并发编程。主要内容包括:如何获取EventLoop,使用run_until_complete执行协程,为Future添加回调函数,以及如何使用gather函数来聚合多个协程的执行。
1465

被折叠的 条评论
为什么被折叠?



