繁体   English   中英

Python:如果不使用 asyncio.gather(),为什么要使用 AsyncIO?

[英]Python: why use AsyncIO if not with asyncio.gather()?

我最近开始研究 Python 中的异步编程。 假设我们想异步运行一个函数,下面是一个例子:

async def print_i_async(no):
    print("Async: Preparing print of " + str(no))
    await asyncio.sleep(1)
    print(str(no))

async def main_async(no):
    await asyncio.gather(*(print_i_async(i) for i in range(no)))

asyncio.run(main_async(no))

这将按预期异步工作。 然而,我不清楚,如果不使用asyncio.gather() ,我们为什么要使用异步函数。 例如:

def print_i_serial(no):
    print("Serial: Preparing print of " + str(no))
    time.sleep(1)
    print(str(no))

for i in range(5):
    print_i_serial(i)

for i in range(5):
    asyncio.run(print_i_async(i))

这两个函数产生相同的结果。 我错过了什么吗? 如果我们不使用asyncio.gather() ,我们是否有任何理由使用async def ,因为这是我们实际获得异步结果的方式?

除了gather之外,还有很多使用asyncio原因。

您真正要问的是:除了gather之外,还有更多方法可以创建并发执行吗?

答案是肯定的。

是的, gather是使用asyncio创建并发性的最简单、最直接的示例asyncio ,但它不仅限于gather gather所做的是创建一堆等待对象(如果需要,例如协程被包装在一个任务中)以等待并在所有期货准备好后返回结果(以及一堆其他东西,例如传播取消)。

让我们再看两个实现并发的方法的例子:

  1. as_completed - 与gather类似,您发送一堆可等待对象,但不是等待所有等待对象都准备好,此方法会在它们准备好、无序时返回给您。
  2. 另一个例子是自己创建任务,例如使用event_loop.create_task() 这将允许您创建一个将在事件循环上运行的任务,您可以稍后await 同时(直到您await任务)您可以继续运行其他代码,并基本上实现并发(注意任务不会立即运行,但只有当您将控制权交还给事件循环并处理任务时)。

实现并发的方法还有很多。 您可以从这些示例开始(第二个示例实际上是您可以用来创建许多不同的并发执行“拓扑”的通用方法)。

您可以先阅读https://docs.python.org/3/library/asyncio-task.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM