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

  • 相关阅读:
    为什么 PHP 程序员应该学习使用 Swoole
    如何优雅的使用和理解线程池
    Redis 数据结构-字符串源码分析
    MySQL多版本并发控制机制(MVCC)-源码浅析
    Spring事务用法示例与实现原理
    J2Cache 和普通缓存框架有何不同,它解决了什么问题?
    Spring Aop之Cglib实现原理详解
    Python中字符串拼接的N种方法
    使用Fiddler抓取到的“姐夫酷”API接口
    [Android]Space控件的应用场景
  • 原文地址:https://www.cnblogs.com/msj513/p/9959972.html
Copyright © 2011-2022 走看看