Python异步编程
一、异步编程原理
1、I/O概念
什么是I/O?
- 顾名思义,它所指的是Input/Output,即输入/输出,对文件实现输入/输出称为I/O
- I/O操作的基本对象为文件
- 文件既可以是设备文件,也可以是普通文件。
- Linux系统中,I/O的类型可以分为标准I/O与文件I/O。标准I/O和文件I/O是为了实现对文件读写而封装的两套不同的用户程序编程接口。
- 标准I/O采用间接系统调用(库函数)的方式实现对文件的读写。
- 文件I/O采用直接系统调用的方式实现对文件的读写。
- 同时针对I/O的操作模式,也实现了阻塞I/O、非阻塞I/O、多路复用I/O以及异步I/O,这四种典型的模型。
I/O不会占用CPU!!!
I/O(Input/Output)就是指输入输出操作,包括读写磁盘、网络传输、键盘输入等。
在很多时候,I/O操作涉及到与外部设备(如硬盘、网络接口等)的通信,需要等待外部设备响应或数据传输完成,等待过程称为阻塞(Blocking),在这个过程中,不需要一直占用CPU,CPU可以去做其他事情。
同时,操作系统也提供了一些异步(Asynchronous)I/O操作的方式,可以在I/O操作进行的同时进行其他操作,提高系统效率。
因此,I/O操作不会一直占用CPU,但会占用一定的系统资源。
https://www.zhihu.com/tardis/bd/ans/2963372182?source_id=1001
I/O概述
https://blog.csdn.net/weixin_48120109/article/details/116245336
关于I/O——内存与CPU与磁盘之间的关系
https://blog.csdn.net/weixin_43381316/article/details/125407298
Linux高级系统编程— I/O— I/O的基本概念、Linux标准I/O
2、协程简介
协程(coroutine)
- 不是计算机本身提供的能力,而是通过程序员自己人为通过代码创建实现的
- 也叫做微线程,是一种用户态内的上下文切换技术
- 本质就是通过一个线程实现代码块互相切换执行
以下是ChatGPT4的回答
1 | 在Python中,异步编程主要利用的是协程(coroutines),这是用于I/O密集型任务的一种编程模型。协程利用的是单线程内部的上下文切换,而不是多线程或者多进程。异步编程的关键就在于,当我们遇到I/O等待时,如网络请求、数据库查询等,该协程将被挂起,CPU则去处理其它的协程,这样就大大提高了效率。 |
二、代码示例
2、普通代码执行
1 | def f1(): |
从上面代码可以看出,是依次执行的代码,这样相当于是串联的,这样效率比较低下
3、python实现协程的几种方法
协程的官方文档:https://docs.python.org/zh-cn/3.7/library/asyncio-task.html
协程实现的几种方法
- greenlet:是一个比较早期的模块
- yield关键字:表示是一个生成器
- asyncio装饰器:在python3.4中使用,后面会在3.10中移除
- async、await关键字:python3.5+ 推荐使用的,后续版本也会持续使用
3.1 greenlet
1 | ``` |
3.3 asyncio装饰器
官方解释:asyncio装饰器
对基于生成器的协程的支持 已弃用 并计划在 Python 3.10 中移除。
基于生成器的协程是 async/await 语法的前身。它们是使用
yield from
语句创建的 Python 生成器,可以等待 Future 和其他协程。基于生成器的协程应该使用
@asyncio.coroutine
装饰,虽然这并非强制。
1 |
|
4、async关键字实现协程示例
本质:可以通过人为控制,在函数代码之间进行切换