第95p,最常见的4种网络IO模型
推荐给朋友,和朋友一起学习知识 |
大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第95篇文章,第三阶段的课程:Python进阶知识:网络编程的IO模型知识。
IO模型描述的是程序等待用户输入时处理数据的方式。
注:本文只涉及网络IO模型,IO模型有多种,这里只介绍4种常见的IO模型。
一、阻塞IO
阻塞IO可以称为“一根筋”,
当调用recv()函数时,系统首先查是否有准备好的数据。
如果数据没有准备好,那么系统就处于等待状态。
当数据准备好后,将数据从系统缓冲区复制到用户空间,然后该函数返回。在套接应用程序中,当调用recv()函数时,未必用户空间就已经存在数据,那么此时recv()函数就会处于等待状态。
二、非阻塞IO
非阻塞IO就比较灵活一点,提交请求后,无论是否有数据,都会立刻得到一个结果 ;
等待数据阶段(accept),就不会影响程序的运行;
1、发送请求accept,无论什么情况,都会给一个recv;
2、因为一直是在执行态与就绪态之间,CPU不会处于IO阻塞状态。
三、IO多路复用
IO多路复用是由操作系统提供一个监管机制,能够监管socket对象和conn对象,只要有人触发了,立刻就返回可执行的对象;
但当监管的对象只有一个的时候,IO多路复用的效率比阻塞IO还低;
不过,IO多路复用可以同时监管N个对象;
这个监管机制是由操作系统提供的,常见的监管机制有select机制(wint和linux都有)、epoll机制(只有linux有,epoll就是异步回调机制);
注:select和poll都可以监管多个对象,但是poll可以监管更多的对象。
四、异步IO
应用只需要向内核发送一个read请求,告诉内核它要读取数据后即刻返回;
内核收到请求后会建立一个信号联系,当数据准备就绪,内核会主动把数据从内核复制到用户空间,等所有操作都完成之后;
内核会发起一个通知告诉应用,我们称这种模式为异步IO模型。
在Python中实现异步的方式也比较简单,使用async和await关键字就可以轻松实现异步。
Pythin中常用的异步框架,包括:sanic、tornado、Twisted。
其实,IO模型更重要的是理解其中的概念,具体的执行过程和专业术语不需要死记硬背。
阻塞IO模型是一根筋,发送请求,必须等到数据,否则它会一直在等;
非阻塞IO模型很灵活,发送请求,不管有没有数据它都会返回结果;
IO多路复用是“大户人家”,一个人搞不定,那我招几万个“人”来帮忙不就行了吗?(多线程)
异步IO是时间管理大师,把N个线程管理的有条不紊、井然有序。
以上是本期内容,如果有表达不对的内容,欢迎您的留言、斧正,我们一起天天向上。
感谢您的阅读,您的三连【关注、点赞、收藏】就是对我最大的支持,谢谢!
本文由杨数Tos原创,欢迎关注,带你一起长知识。
推 荐 内 容