Skip to main content

Python asyncio协程 - gather(1)

Python asyncio协程 - gather(1)

Python asyncio协程 - gather(1)

在Python 3的协程中,官方针对gather的使用有几个特性的说明,先说第一点的特性

并发执行aws参数指定的 可等待(awaitable)对象序列。

如果 aws 中的某个可等待对象为协程,它将自动作为一个任务加入日程。

可以理解为 如果 aws 序列中的某个 awaitable 对象 是一个 协程,则自动将这个 协程 封装为 Task对象进行处理

看下面的代码

import asyncio


async def fac(name, number):
    num = 1

    for i in range(2, number + 1):
        print(f"Task {name}: Compute fac({i})")
        await asyncio.sleep(1)
        num *= i

    print(f"Task {name}: fac({number}) = {num}")


async def main():
    await asyncio.gather(fac("xiao wang", 2), fac("xiao li", 3),
                         fac("xiao zhang", 4))


asyncio.run(main())

运行下看下结果

$ python main.py
Task xiao wang: Compute fac(2)
Task xiao li: Compute fac(2)
Task xiao zhang: Compute fac(2)
Task xiao wang: fac(2) = 2
Task xiao li: Compute fac(3)
Task xiao zhang: Compute fac(3)
Task xiao li: fac(3) = 6
Task xiao zhang: Compute fac(4)
Task xiao zhang: fac(4) = 24

再来对比下下面的代码

import asyncio


async def fac(name, number):
    num = 1

    for i in range(2, number + 1):
        print(f"Task {name}: Compute fac({i})")
        await asyncio.sleep(1)
        num *= i

    print(f"Task {name}: fac({number}) = {num}")


async def main():
    task1 = asyncio.create_task(fac("xiao wang", 2))
    task2 = asyncio.create_task(fac("xiao li", 3))
    task3 = asyncio.create_task(fac("xiao zhang", 4))

    await asyncio.gather(task1, task2, task3)

asyncio.run(main())

运行看下效果

$ python main.py
Task xiao wang: Compute fac(2)
Task xiao li: Compute fac(2)
Task xiao zhang: Compute fac(2)
Task xiao wang: fac(2) = 2
Task xiao li: Compute fac(3)
Task xiao zhang: Compute fac(3)
Task xiao li: fac(3) = 6
Task xiao zhang: Compute fac(4)
Task xiao zhang: fac(4) = 24

这样应该可以理解为自动封装为一个task对象来处理了。

版权声明

版权声明

张大鹏 创作并维护的 Walkerfree 博客采用 创作共用保留署名-非商业-禁止演绎4.0国际许可证。本文首发于 Walkerfree 博客(http://www.walkerfree.com/),版权所有,侵权必究。本文永久链接:http://www.walkerfree.com/article/227