深入Asyncio异步解析式
Posted ikct2017
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了深入Asyncio异步解析式相关的知识,希望对你有一定的参考价值。
Async Comprehensions
目前已经学会了如何在Python中进行异步迭代,接下来的问题是这是否适用于解析式?答案是OJBK!该支持在PEP 530中提及,建议去读一下。
>>> import asyncio
>>> async def doubler(n): # 1
... for i in range(n):
... yield i, i*2
... await asyncio.sleep(0.1) # 2
>>> async def main():
... result = [x async for x in doubler(3)] # 3
... print(result)
... result = {x: y async for x, y in doubler(3)}
... print(result)
... result = {x async for x in doubler(3)}
... print(result)
>>> asyncio.get_event_loop().run_until_complete(main())
[(0, 0), (1, 2), (2, 4)]
{0: 0, 1: 2, 2: 4}
{(1, 2), (0, 0), (2, 4)}
这是个简单的异步生成器;
sleep一会,确保这是个异步函数;
观察如何用async for替代for;
在PEP 530后半段有介绍在解析式中使用await
,但要注意的是,await
只能在async def
函数体中使用。
继续用例子来熟悉异步编程语法。
>>> import asyncio
>>> async def f(x): # 1
... await asyncio.sleep(0.1)
... return x + 100
>>> async def fac(n): # 2
... for x in range(n):
... await asyncio.sleep(0.1)
... yield f, x # 3
>>> async def main():
... results = [await f(x) async for f, x in fac(3)] # 4
... print(‘results=‘, results)
>>> asyncio.get_event_loop().run_until_complete(main())
results= [100, 101, 102]
一个简单的协程函数;
异步生成器;
返回一个包含函数和参数的tuple;
fac(3)
返回一个异步生成器,必须用异步for调用,返回值是几个tuple,通过参数中的函数调用生成一个coroutine,用await
处理coroutine,await
与async for
做的是完全不相关的事。
以上是关于深入Asyncio异步解析式的主要内容,如果未能解决你的问题,请参考以下文章
深入理解 python3.4 中 Asyncio 库与 Node.js 的异步 IO 机制
自己手写调度器,理解Python中的asyncio异步事件循环与协程