非阻塞IO模型 nonblocking IO
Posted msj513
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了非阻塞IO模型 nonblocking IO相关的知识,希望对你有一定的参考价值。
非阻塞IO模型
非阻塞IO模型的就是将原来的阻塞操作变成非阻塞的,当原来阻塞操作编程操作后就会有信号,没有信号的就就干其他事情,循环询问,循环执行其他事情,直到操作系统返回正确的信号就会继续执行。
import socket server = socket.socket() #重用端口 server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1) server.bind(("127.0.0.1",5555)) server.listen(5) #将原来的阻塞(像是accept等)编程非阻塞 server.setblocking(False) #存在的连接列表 clients = [] data_dic = [] while True: try: conn,addr = server.accept() #只有接到连接才是正常执行 #抛出异常相当于,操作系统告诉应用程序,阻塞需要的消息不存在,去执行其他任务 clients.append(conn)#将连接保存,然后集体操作连接 except BlockingIOError: #没有连接建立抛出异常 #转其他工作,像是接受已经建立连接的信息 for c in clients[:]: try: data = c.recv(1024)#非阻塞 if not data: c.close()#关闭连接 # 将不存在的客户端连接删除,取消下次的无用操作 clients.remove(c) continue#linux 的错误连接 #接受数据将数据和连接放进字典 data_dic.append((c,data.upper())) except BlockingIOError: #没有接到发送的数据 pass except ConnectionResetError: #关闭连接 clients.remove(c) c.close() #其他任务之发送信息给客户端(当无法继续接受信息后) for data in data_dic[:]: try: data[0].send(data[1]) #发送删除,防止下次继续发 data_dic.remove(data) except BlockingIOError: continue except ConnectionResetError: # 客户端连接需要删除 data[0].close()#关闭连接 clients.remove(data[0])#移除连接 data_dic.remove(data)#移除发送信息
这里将异常作为accept和recv等wait data 的阻塞,将异常作为信号,接到信号处理其他任务的非阻塞解决方案。
以上是关于非阻塞IO模型 nonblocking IO的主要内容,如果未能解决你的问题,请参考以下文章