zoukankan      html  css  js  c++  java
  • 非阻塞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 的阻塞,将异常作为信号,接到信号处理其他任务的非阻塞解决方案。

  • 相关阅读:
    抽象类
    处理网络问题的几种方法
    File类
    计算机专业的学生要怎样做才能避免成为低级的码农(转自TechFlow2019)
    java集合类
    分享一位程序员的时间管理
    WP7 操作XML文件
    C#和C/C++指针实现swap交换
    [置顶] IList接口数据动态、递归生成TreeView
    产生随机数
  • 原文地址:https://www.cnblogs.com/msj513/p/9959972.html
Copyright © 2011-2022 走看看