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)

  • 功能:设置套接字的超时时间
  • 参数:设置的时间

IO并发模型

 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
非阻塞IO示例

相关文章:

  • 2022-12-23
  • 2021-08-26
  • 2021-08-14
猜你喜欢
  • 2021-10-07
  • 2021-12-30
  • 2021-10-02
  • 2021-05-18
  • 2022-02-15
  • 2022-12-23
相关资源
相似解决方案