gpt4 book ai didi

python-3.x - 使用create_task()或collect()效率更高吗?

转载 作者:行者123 更新时间:2023-12-04 00:58:40 25 4
gpt4 key购买 nike

我仍然使用异步python的基础知识,有些事情使我感到困惑。

import asyncio
loop=asyncio.get_event_loop()
for variation in args:
loop.create_task(coroutine(variation))
loop.run_forever()

似乎与此非常相似
import asyncio
loop=asyncio.get_event_loop()
loop.run_forever(
asyncio.gather(
coroutine(variation_1),
coroutine(variation_2),
...))

他们可能会做同样的事情,但这似乎没有用,那么有什么区别呢?

最佳答案

如评论中所述,您的第二个示例应使用 run_until_complete ,而不是 run_forever

They might do the same thing, but that doesn't seem useful, so what's the difference?


asyncio.gather是更高级别的构造。
  • create_task 将协程提交到事件循环,有效地使其在“后台”运行(假设事件循环本身是事件的)。顾名思义,它返回task,它是协程执行的句柄,最重要的是提供了cancel的功能。您可以在事件循环中创建任意数量的此类任务,它们将一直运行到各自完成为止。
  • asyncio.gather 用于当您实际上对所产生的协程的结果感兴趣时。它像使用create_task一样生成它们,允许它们并行运行,但也等待它们全部完成,然后返回它们各自的结果(或者如果它们中的任何一个引发了异常,则引发异常)。

  • 例如,如果您有一个 download协程下载一个URL并返回其内容,并且要下载URL列表,则 gather允许您将URL与其数据进行匹配:
    url_list = [...]
    data_list = await asyncio.gather(*[download(url) for url in url_list]

    # url_list and data_list now have matching elements, so this works:
    for url, data in zip(url_list, data_list):
    ...

    仅使用 create_task进行此操作会更加复杂。

    关于python-3.x - 使用create_task()或collect()效率更高吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52245922/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com