asyncio

作用

  • 提供了对携程的支持
  • 非阻塞: 协程允许在等待异步操作的同时执行其他任务,而不会阻塞整个程序。
  • 轻量: 相对于线程和进程,协程的开销较小,因为它们在单线程中执行。
  • 使用async/await语法: async def声明协程函数,await用于等待异步操作的完成。
  • 事件循环: 协程需要在事件循环中运行,asyncio模块提供了事件循环的支持。

协程和线程(可以理解为一个是用户级,一个是系统级)

  • 携程
    • 在携程中,程序员编写的代码负责主动让出CPU的控制权。
    • 属于轻量级的线程
  • 线程
    • 操作系统控制CPU的控制权(单核CPU执行多个进程就是这样的)

携程的定义和使用

自动获取当前线程的event_loop

# 定义携程
async def show_msg() -> None:
    print('show')
    await asyncio.sleep(0.8)
    print('msg')


# 使用协程
if __name__ == "__main__":
    # asyncio.run() 本身是同步的
    asyncio.run(show_msg())

手动获取当前的 event_loop

import asyncio

async def main():
    # 获取当前'线程'事件循环
    loop = asyncio.get_event_loop()

    # 将任务丢进事件循环里面
    task = loop.create_task(show_msg())

    # 阻塞当前携程等待任务完成
    await task

# 运行主协程
asyncio.run(main())