[英]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
所做的是创建一堆等待对象(如果需要,例如协程被包装在一个任务中)以等待并在所有期货准备好后返回结果(以及一堆其他东西,例如传播取消)。
让我们再看两个实现并发的方法的例子:
as_completed
- 与gather
类似,您发送一堆可等待对象,但不是等待所有等待对象都准备好,此方法会在它们准备好、无序时返回给您。event_loop.create_task()
。 这将允许您创建一个将在事件循环上运行的任务,您可以稍后await
。 同时(直到您await
任务)您可以继续运行其他代码,并基本上实现并发(注意任务不会立即运行,但只有当您将控制权交还给事件循环并处理任务时)。实现并发的方法还有很多。 您可以从这些示例开始(第二个示例实际上是您可以用来创建许多不同的并发执行“拓扑”的通用方法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.