IO 分类
IO分类:阻塞IO ,非阻塞IO,IO多路复用,异步IO等
阻塞IO
1.定义:在执行IO操作时如果执行条件不满足则阻塞。阻塞IO是IO的默认形态。
2.效率:阻塞IO是效率很低的一种IO。但是由于逻辑简单所以是默认IO行为。
3.阻塞情况:
-
因为某种执行条件没有满足造成的函数阻塞
e.g. accept input recv -
处理IO的时间较长产生的阻塞状态
e.g. 网络传输,大文件读写
非阻塞IO
1.定义 :通过修改IO属性行为,使原本阻塞的IO变为非阻塞的状态。
设置套接字为非阻塞IO
sockfd.setblocking(bool)
- 功能:设置套接字为非阻塞IO
- 参数:默认为True,表示套接字IO阻塞;设置为False则套接字IO变为非阻塞
超时检测 :设置一个最长阻塞时间,超过该时间后则不再阻塞等待。
sockfd.settimeout(sec)
- 功能:设置套接字的超时时间
- 参数:设置的时间
1 from socket import * 2 from time import sleep,ctime 3 4 # 日志文件 5 f = open('log.txt','a+') 6 7 # 创建套接字 8 sockfd = socket() 9 sockfd.bind(('127.0.0.1',9999)) 10 sockfd.listen(3) 11 12 # 设置套接字为非阻塞 13 sockfd.setblocking(False) 14 15 # 设置超时检测时间 16 sockfd.settimeout(3) 17 18 while True: 19 print("Waiting for connect...") 20 try: 21 connfd,addr = sockfd.accept() 22 except (BlockingIOError,timeout) as e: 23 # 如果没有客户端连接,每隔3秒写一个日志 24 f.write("%s : %s\n"%(ctime(),e)) 25 f.flush() 26 sleep(3) 27 else: 28 print("Connect from",addr) 29 data = connfd.recv(1024).decode() 30 print(data) 31 32 # Waiting for connect... 33 # Waiting for connect... 34 # Waiting for connect... 35 #log.txt文件逐渐写入 36 # Thu Jun 27 00:29:29 2019 : timed out 37 # Thu Jun 27 00:29:35 2019 : timed out 38 # Thu Jun 27 00:29:41 2019 : timed out