在内存中存在数据交互的操作认为是IO操作
和终端交互:input print
和磁盘交互:read write
和网络交互:recv send
IO密集型程序:在程序执行中有大量的IO操作,有较少的cpu运算,消耗cpu少,效率低,耗时长
计算密集型程序:在程序运行过程中,IO操作较少,cpu计算较多,cpu消耗大,运行速度快
由于IO密集型程序在日常工作中必不可少,但其效率低,耗时长,因此产生了IO模型
IO模型:阻塞IO,非阻塞IO,IO多路复用,时间IO,异步IO等
阻塞IO
是IO的默认形态,效率很低的一种IO。
阻塞情况:因为某种条件没有达成的函数阻塞(accept, input, recv)。处理IO的时间较长产生的阻塞行为(网络延迟,大文件的读写)
非阻塞IO
将原本阻塞的函数通过属性的设置改变阻塞行为,变为非阻塞
sockfd.setblocking(bool)
功能: 设置套接字为非阻塞IO
参数: 默认True 表示套接字调用阻塞函数时为阻塞状态
设置为False则表示非阻塞状态
超时检测,即设置一个最长阻塞等待时间,超时后即不再阻塞
sockfd.settimeout(sec)
功能:设置套接字超时时间
参数: 设置的时间, 秒
* 超时检测不能和非阻塞通用,否则超时没有意义
服务器端
from socket import *
from time import sleep,ctime
# tcp套接字
sockfd = socket()
sockfd.bind(('0.0.0.0',8888))
sockfd.listen(3)
# 设置为非阻塞
# sockfd.setblocking(False)
# 设置超时等待
sockfd.settimeout(3)
while True:
print("Waiting for connect....")
try:
connfd,addr = sockfd.accept()
except BlockingIOError:
sleep(2)
print(ctime(2))
print("无阻塞")
continue
except timeout:
print("超时等待5秒...")
continue
else:
data = connfd.recv(1024).decode()
print(data)
connfd.send(b'Receive message')
break
sockfd.close()
未完.........