Skip to main content

Python小知识 - asyncio之sleep和gather

Python小知识 - asyncio之sleep和gather

Python小知识 - asyncio之sleep和gather

asyncio 之 Sleep 阻塞休眠

coroutine asyncio.sleep(delay, result=None, *, loop=None)

阻塞指定的描述

如果指定了 result,则当协程完成时将其返回给调用者。

sleep() 总是会挂起当前任务,以允许其他任务运行。

Deprecated since version 3.8, will be removed in version 3.10: loop 形参。

以下协程示例运行 5 秒,每秒显示一次当前日期:

import asyncio
import datetime

async def display_date():
    loop = asyncio.get_running_loop()
    end_time = loop.time() + 5.0
    while True:
        print(datetime.datetime.now())
        if (loop.time() + 1.0) >= end_time:
            break

        await asyncio.sleep(1)

asyncio.run(display_date())

运行结果类似如下

$ python main.py
2020-08-13 22:26:19.414429
2020-08-13 22:26:20.417651
2020-08-13 22:26:21.418705
2020-08-13 22:26:22.420557
2020-08-13 22:26:23.421803

asyncio 之 Gather 并发运行任务

awaitable asyncio.gather(*aws, loop=None, return_exceptions=False)¶

并发 运行 aws 序列中的 可等待对象。

 

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

如果所有可等待对象都成功完成,结果将是一个由所有返回值聚合而成的列表。结果值的顺序与 aws 中可等待对象的顺序一致。

如果 return_exceptions 为 False (默认),所引发的首个异常会立即传播给等待 gather() 的任务。aws 序列中的其他可等待对象 不会被取消 并将继续运行。

如果 return_exceptions 为 True,异常会和成功的结果一样处理,并聚合至结果列表。

如果 gather() 被取消,所有被提交 (尚未完成) 的可等待对象也会 被取消。

如果 aws 序列中的任一 Task 或 Future 对象 被取消,它将被当作引发了 CancelledError 一样处理 -- 在此情况下 gather() 调用 不会 被取消。这是为了防止一个已提交的 Task/Future 被取消导致其他 Tasks/Future 也被取消。

Deprecated since version 3.8, will be removed in version 3.10: loop 形参。

简单应用实例

import asyncio


async def factorial(name, number):
    f = 1
    for i in range(2, number + 1):
        print(f"Task {name}: Compure factorial({i})")
        await asyncio.sleep(1)
        f *= i
    print(f"Task {name}: factorial({number}) = {f}")


async def main():
    await asyncio.gather(factorial("X", 2), factorial("Y", 3),
                         factorial("Z", 4))


asyncio.run(main())

运行结果类似如下

$ python main.py
Task X: Compure factorial(2)
Task Y: Compure factorial(2)
Task Z: Compure factorial(2)
Task X: factorial(2) = 2
Task Y: Compure factorial(3)
Task Z: Compure factorial(3)
Task Y: factorial(3) = 6
Task Z: Compure factorial(4)
Task Z: factorial(4) = 24

 

版权声明

版权声明

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