深刻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)}
  1. 这是个简单的异步生成器;bash

  2. sleep一会,确保这是个异步函数;异步

  3. 观察如何用async for替代for;async


在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]
  1. 一个简单的协程函数;oop

  2. 异步生成器;code

  3. 返回一个包含函数和参数的tuple;协程

  4. fac(3)返回一个异步生成器,必须用异步for调用,返回值是几个tuple,经过参数中的函数调用生成一个coroutine,用await处理coroutine,awaitasync for作的是彻底不相关的事。ci

相关文章
相关标签/搜索