【问题标题】:Python: why use AsyncIO if not with asyncio.gather()?Python:如果不使用 asyncio.gather(),为什么还要使用 AsyncIO?
【发布时间】:2020-11-01 14:12:09
【问题描述】:

我最近开始研究 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,因为这是我们实际获得异步结果的方式?

【问题讨论】:

    标签: python python-3.x asynchronous concurrency python-asyncio


    【解决方案1】:

    除了gather之外,还有很多使用asyncio的理由。

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

    答案是肯定的。

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

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

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

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

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

    【讨论】:

    • 感谢您的回答。我知道我可以使用gather()create_task() 创建并发执行。我的问题是:如果不运行并发任务,是否有任何理由使用 asyncio?在我做的第二个例子中, async def 和 def 的结果是相同的,并且需要相同的时间。如果我们需要并发(在这种情况下我们会使用gather或create_task),是否有任何使用async的目的?
    • @Lorenzo 在第二个示例中,两种情况都花费了相同的时间,因为它们都是串行运行的。没有并发,所以你不能期待不同的结果。如果您的代码没有任何并发​​性,则没有理由将其设为async。 (例外:在这种情况下,仍然有 async 函数的唯一原因是,如果您正在编写一个库,并且虽然您的代码本身不是并发的,但您的代码中确实有 I/O,并且您不想限制你的用户,那么你应该使用协程)。
    • 完美,谢谢!我想确保我没有错过任何有关该主题的内容!
    猜你喜欢
    • 2012-08-03
    • 1970-01-01
    • 2015-04-24
    • 2012-09-06
    • 2010-12-26
    • 1970-01-01
    • 2013-09-29
    • 1970-01-01
    相关资源
    最近更新 更多