非阻塞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的主要内容,如果未能解决你的问题,请参考以下文章

高性能IO模型浅析

高性能IO模型浅析

高性能IO模型浅析

高性能Socket模型

网络通信模型(IO模型)学习摘要

ASP.NET Core MVC I/O编程模型