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()
发表评论