码迷,mamicode.com
首页 > 其他好文 > 详细

非阻塞IO模型 nonblocking IO

时间:2018-11-14 21:00:53      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:try   eset   soc   app   wait   error   blocking   没有   字典   

非阻塞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

标签:try   eset   soc   app   wait   error   blocking   没有   字典   

原文地址:https://www.cnblogs.com/msj513/p/9959972.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!