赞
踩
IO指的是输入输出,输入输出都是一个耗时的操作,程序中一旦遇到了输入输出就会被阻塞,导致程序效率降低,IO模型也就是输入输出模型,是为了提高IO效率而出现。
IO本质上也分为不同类型,其中最典型的就是网络IO,由于网络速度比运算速度慢很多,所以大量的时间都是在等待网络IO,这也是我们要关注的重点!
网络通讯时,应用程序的数据是交由操作系统来进行发送的,同样接收数据时也是操作系统先收到消息。
为了更好的理解IO模型,需要先了解数据的接收和发送经历了哪些阶段过程。
1.发送数据时 send sendto
数据从应用程序内存copy到系统缓存,后续操作由操作系统完成,只需经历copydata阶段
import socket c = socket.socket() c.connect(("127.0.0.1",9898)) while True: data = input(":") if not data:continue c.send(data.encode("utf-8")) # 阻塞函数 速度较快 感觉不到阻塞
2.接收数据时 recv recvfrom accept
向操作系统发起读取操作后,必须要等待数据到达缓冲区,然后在从缓冲区copy到应用程序内存
所以接收数据 需要先经历waitData 再经历copyData
import socket s = socket.socket() s.bind(("127.0.0.1",9898)) s.listen() while True: c,addr = s.accept() # 阻塞 while True: data = c.recv(1024) # 阻塞 print(data.decode("utf-8"))
阻塞IO指的是程序一旦发起了相关的调用后,必须在阻塞在原地,等待IO操作结束后才能继续执行。
目前所学的所有TCP程序都属于阻塞IO模型(gevent除外),默认情况下socket提供的一系列方法都是阻塞的
如:recv send accept等,
需要强调的是:无论是什么样的IO模型都必须经历waitData和copyData,区别就在于对这两个阶段的处理方式不同。
阻塞IO具体流程如下:
大量的时间都耗费在等待waitData和 copyData上,而阻塞IO必须在原地等待,所以该模型的效率不高。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。