python - asyncio.create_task() 做什么?

标签 python python-3.x async-await python-asyncio

asyncio.create_task() 是什么意思做?我查看了文档,似乎无法理解。让我困惑的一段代码是这样的:

import asyncio

async def counter_loop(x, n):
    for i in range(1, n + 1):
        print(f"Counter {x}: {i}")
        await asyncio.sleep(0.5)
    return f"Finished {x} in {n}"

async def main():
    slow_task = asyncio.create_task(counter_loop("Slow", 4))
    fast_coro = counter_loop("Fast", 2)

    print("Awaiting Fast")
    fast_val = await fast_coro
    print("Finished Fast")

    print("Awaiting Slow")
    slow_val = await slow_task
    print("Finished Slow")

    print(f"{fast_val}, {slow_val}")

asyncio.run(main())
这给出了以下输出:
001 | Awaiting Fast
002 | Counter Fast: 1
003 | Counter Slow: 1
004 | Counter Fast: 2
005 | Counter Slow: 2
006 | Finished Fast
007 | Awaiting Slow
008 | Counter Slow: 3
009 | Counter Slow: 4
010 | Finished Slow
011 | Finished Fast in 2, Finished Slow in 4
我不太明白这是如何工作的。
  • 不应该 slow_task在完成之前无法运行fast_coro因为它从未在 asyncio.gather 中使用过
    方法?
  • 为什么我们要await slow_task ?
  • 为什么是 Awaiting Slow在协程似乎已经启动后打印?
  • 什么是真正的任务?我知道gather正在做的是安排一个
    任务。和create_task据说创建了一个任务。

  • 一个深入的答案将不胜感激。谢谢!
    值得一提的是,我对 Futures 知之甚少。

    最佳答案

    What does asyncio.create_task() do?


    它提交协程以“在后台”运行,即与当前任务和所有其他任务同时运行,在它们之间切换 await点。它返回一个称为“任务”的等待句柄,您也可以使用它来取消协程的执行。
    它是 asyncio 的核心原语之一,相当于启动线程的 asyncio。 (同理,使用 await 等待任务相当于加入线程。)

    Shouldn't the slow_task not be able to run until the completion of the fast_coro


    不,因为您明确使用了 create_task开始slow_task在后台。你是否写过类似的东西:
        slow_coro = counter_loop("Slow", 4)
        fast_coro = counter_loop("Fast", 2)
        fast_val = await fast_coro
    
    ...确实 slow_coro不会运行,因为还没有人将它提交给事件循环。但是create_task正是这样做的:将其提交到事件循环以与其他任务同时执行,切换点为任意await .

    because it was never used in an asyncio.gather method?

    asyncio.gather不是在 asyncio 中实现并发的唯一方法。它只是一个实用函数,可以更轻松地等待多个协程全部完成,并同时将它们提交到事件循环。 create_task只是提交,它应该被称为 start_coroutine或类似的东西。

    Why do we have to await slow_task?


    我们不必这样做,它只是等待两个协程干净地完成。代码也可以等待 asyncio.sleep()或类似的东西。从 main() 返回(和事件循环)立即处理一些仍待处理的任务也可以正常工作,但它会打印一条警告消息,指示可能存在错误。在停止事件循环之前等待(或取消)任务更干净。

    What really is a task?


    它是一个 asyncio 构造,用于在具体事件循环中跟踪协程的执行。当您调用 create_task ,你提交一个协程执行并收到一个句柄。当你真正需要结果时,你可以等待这个句柄,或者如果你不关心结果,你永远不能等待它。这个句柄就是任务,它继承自 Future ,这使它可以等待并且还提供了基于回调的较低级别的接口(interface),例如add_done_callback .

    关于python - asyncio.create_task() 做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62528272/

    相关文章:

    python - 如何清理pandas数据框中的索引值?

    python - 在基于 trio 的 Python 应用程序中生成进程并在进程之间进行通信

    python-3.x - MyPy 不允许受约束的 TypeVar 协变?使用受约束但协变的键值类型定义通用字典

    javascript - 类 - 通过等待返回数据?

    javascript - 仅在获取所有文件后执行命令

    python - 了解 Django 基于类的 View 混合

    Python timedelta 跨越 DST 转换返回不正确的结果?

    python - 在Python中查找列表中所有单词的字符数

    python - 导入错误 : No module named 'resource'

    c# - 在 C# : Remove Task. Wait() 中使用 Web 服务