python携程asyncio_Python协程(三) Asyncio运行

一、运行Asyncio程序

asyncio.run(coro, *, debug=False)

执行 coroutine coro 并返回结果。

此函数运行传入的协程,负责管理 Asyncio 事件循环并完结异步生成器。

当有其他 asyncio 事件循环在同一线程中运行时,此函数不能被调用。

如果 debug 为 True,事件循环将以调试模式运行。

此函数总是会创建一个新的事件循环并在结束时关闭之。它应当被用作 Asyncio 程序的主入口点,理想情况下应当只被调用一次。

示例:

async defmain():

await asyncio.sleep(1)print('hello')

asyncio.run(main())

二、创建任务

asyncio.create_task(coro, *, name=None)

将 coro 协程 打包为一个 Task 排入日程准备执行。返回 Task 对象。

如果name 不为 None,它将使用 Task.set_name() 来设为任务的名称。

该任务会在 get_running_loop() 返回的循环中执行,如果当前线程没有在运行的循环则会引发 RuntimeError。

此函数 在 Python 3.7 中被加入。在 Python 3.7 之前,可以改用低层级的 asyncio.ensure_future() 函数。

在 3.8 版更改: 添加了 name 形参。

三、并发运行任务

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 形参。

示例:

importasyncio

asyncdeffactorial(name, number):

f= 1

for i in range(2, number + 1):print(f"Task {name}: Compute factorial({i})...")

await asyncio.sleep(1)

f*=iprint(f"Task {name}: factorial({number}) = {f}")

asyncdefmain():#Schedule three calls *concurrently*:

await asyncio.gather(

factorial("A", 2),

factorial("B", 3),

factorial("C", 4),

)

asyncio.run(main())#Expected output:#

#Task A: Compute factorial(2)...#Task B: Compute factorial(2)...#Task C: Compute factorial(2)...#Task A: factorial(2) = 2#Task B: Compute factorial(3)...#Task C: Compute factorial(3)...#Task B: factorial(3) = 6#Task C: Compute factorial(4)...#Task C: factorial(4) = 24

注解 如果 return_exceptions 为 False,则在 gather() 被标记为已完成后取消它将不会取消任何已提交的可等待对象。 例如,在将一个异常传播给调用者之后,gather 可被标记为已完成,因此,在从 gather 捕获一个(由可等待对象所引发的)异常之后调用 gather.cancel() 将不会取消任何其他可等待对象。

在 3.7 版更改: 如果 gather 本身被取消,则无论 return_exceptions 取值为何,消息都会被传播。

参考文章:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值