Python IO事件,阻塞IO和非阻塞IO,套接字的超时检测【python笔记】

Python IO事件,阻塞IO和非阻塞IO,套接字的超时检测【python笔记】

IO     input     output

在内存中存在数据交换的操作都可以认为是IO操作

和终端交互:  input  print

和磁盘交互:  read  write

和网络交互:  recv  send

IO密集型程序:在程序执行过程中存在大量IO操作,而CPU运算操作较少。消耗CPU较少,运行效率较低

计算密集型程序(CPU密集型程序):在程序执行中CPU运算较多,IO操作相对较少。消耗CPU大,运行速度快

阻塞IO

阻塞IO是IO的默认形态,是效率较低的一种IO情形。

阻塞情况:

因为某种条件没有达到造成的阻塞

如:accept  input  recv

处理IO数据传输时间较长形成的阻塞

如:网络传输过程,文件读写过程

非阻塞IO

通过修改IO事件的属性,使其变为非阻塞状态。(让一些条件阻塞函数不再阻塞)

非阻塞IO往往和循环判断一起使用

s = socket()

s.bind(('0.0.0.0',8888))

s.listen(3)

s.setblocking(False) #将套接字设置为非阻塞,accept时会产生BlockingIOError

while True:

print('等待连接...')

try:

c,addr = s.accept()

except BlockingIOError: #此处必须用try语句捕获 BlockingIOError

sleep(2)

print(ctime())

continue

else:

print('连接至',addr)

while True:

data = c.recv(1024).encode()

if not data:

break

print(data)

c.send(ctime().encode())

c.close()

超时检测

将原本阻塞的函数设置一个最长阻塞时间,如果时间内条件达成则正常运行,如果仍然阻塞则视为超时,继续向下运行或产生异常

s = socket()

s.bind(('0.0.0.0',8888))

s.listen(3)

s.settimeout(5) #将连接超时设置为5秒,5秒后无连接将产生timeout错误

while True:

print('等待连接...')

try:

c,addr = s.accept()

except timeout: #此处必须用try语句捕获 timeout

print(ctime())

continue

else:

print('连接至',addr)

while True:

data = c.recv(1024).encode()

if not data:

break

print(data)

c.send(ctime().encode())

c.close()




最后编辑于:2021/02/10作者: 牛逼PHP

发表评论