当前位置:   article > 正文

Python 异步 协程 asyncio_await asyncio.sleep

await asyncio.sleep

1、介绍:

官网地址:asyncio --- 异步 I/O — Python 3.10.0 文档

asyncio 是用来编写 并发 代码的库,使用 async/await 语法。

asyncio 被用作多个提供高性能 Python 异步框架的基础,包括网络和网站服务,数据库连接库,分布式任务队列等等。

asyncio 往往是构建 IO 密集型和高层级 结构化 网络代码的最佳选择。

2、await

await 后面只能跟可等待对象。

可等待 对象有三种主要类型: 协程任务 和 Future.

2-1:协程

  • 协程函数: 定义形式为 async def 的函数;

  • 协程对象: 调用 协程函数 所返回的对象。

  1. import asyncio
  2. # 被async 修饰的函数叫做协程函数
  3. async def test_demo():
  4. print('start')
  5. ...
  6. print('end')
  7. # 调用协程函数所返回的对象,叫做协程对象
  8. demo1 = test_demo()

2-2:任务

任务 被用来“并行的”调度协程

当一个协程通过 asyncio.create_task() 等函数被封装为一个 任务,该协程会被自动调度执行:

  1. import asyncio
  2. async def nested():
  3. return 42
  4. async def main():
  5. # Schedule nested() to run soon concurrently
  6. # with "main()".
  7. task = asyncio.create_task(nested())
  8. # "task" can now be used to cancel "nested()", or
  9. # can simply be awaited to wait until it is complete:
  10. await task
  11. asyncio.run(main())

2-3:future对象

表示一个异步操作的 最终结果

当一个 Future 对象 被等待,这意味着协程将保持等待直到该 Future 对象在其他地方操作完毕。

在 asyncio 中需要 Future 对象以便允许通过 async/await 使用基于回调的代码。

3、运行 asyncio.run(coro*debug=False)

此函数会运行传入的协程,负责管理 asyncio 事件循环,终结异步生成器,并关闭线程池。

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

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

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

  1. import asyncio
  2. async def main():
  3. await asyncio.sleep(1)
  4. print('hello')
  5. # python 3.7版本新增功能,但是我使用3.9.6版本使用此方法报错:RuntimeError: Event loop is closed
  6. asyncio.run(main())
  7. # python 3.5--end版本可使用以下方式
  8. loop = asyncio.get_event_loop()
  9. loop.run_until_complete(main())

4、创建协程任务:asyncio.create_task(coro*name=None)

将 coro 协程 封装为一个 Task 并调度其执行。返回 Task 对象。

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

  1. import asyncio
  2. async def coro():
  3. print('start')
  4. await ...
  5. print('end')
  6. async def main():
  7. # 创建协程任务
  8. task1 = asyncio.create_task(coro())
  9. task1 = asyncio.create_task(coro())
  10. task_list = [task1, task2]
  11. await asyncio.wait(task_list)
  12. print('hello')
  13. asyncio.run(main())

5、休眠 : asyncio.sleep(delayresult=None*loop=None)

阻塞 delay 指定的秒数。

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

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

将 delay 设为 0 将提供一个经优化的路径以允许其他任务运行。 这可供长期间运行的函数使用以避免在函数调用的全过程中阻塞事件循环。

  1. import asyncio
  2. async def coro():
  3. print('start')
  4. # 当前协程休眠一秒
  5. await asyncio.sleep(1)
  6. print('end')
  7. async def main():
  8. # 创建协程任务
  9. task1 = asyncio.create_task(coro())
  10. task1 = asyncio.create_task(coro())
  11. task_list = [task1, task2]
  12. # 等待
  13. await asyncio.wait(task_list)
  14. print('hello')
  15. asyncio.run(main())

6、简单等待 asyncio.wait

asyncio.wait(aws*loop=Nonetimeout=Nonereturn_when=ALL_COMPLETED)

并发地运行 aws 可迭代对象中的 可等待对象 并进入阻塞状态直到满足 return_when 所指定的条件。

aws 可迭代对象必须不为空。

返回两个 Task/Future 集合: (done, pending)

请注意此函数不会引发 asyncio.TimeoutError。当超时发生时,未完成的 Future 或 Task 将在指定秒数后被返回。

return_when 指定此函数应在何时返回。它必须为以下常数之一:

常数

描述

FIRST_COMPLETED

函数将在任意可等待对象结束或取消时返回。

FIRST_EXCEPTION

函数将在任意可等待对象因引发异常而结束时返回。当没有引发任何异常时它就相当于 ALL_COMPLETED

ALL_COMPLETED

函数将在所有可等待对象结束或取消时返回。

与 wait_for() 不同,wait() 在超时发生时不会取消可等待对象。

* python3.8版本,直接向 wait() 传入协程对象的方式已弃用。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/79994
推荐阅读
相关标签
  

闽ICP备14008679号