IO多路复用

Posted liliudong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了IO多路复用相关的知识,希望对你有一定的参考价值。

IO多路复用 -利用内置模块select[Windows Linux]

  • 循环每一个被监听的项目,看看是否有读写错误操作
  • 所以随着监听项目的增多,效率将变差
  • 服务器端
  • select必须传入三个参数分别是三个列表read_list, write_list, erro_list返回值是一个元祖对应传入的参数

      #select帮助感知某个IO操作是否有变动
      #read开始被read
      #write开始被write
      #erro开始有erro
      #一但感知到就会返回响应的参数
    
    
      import socket
      from select import select
    
      sk = socket.socket()
      address = (‘127.0.0.1‘, 8080)
      sk.bind(address)
      sk.setblocking(False)
      sk.listen() #监听
    
      read_ls = [sk]  #将sk对象加入一个列表
    
      while 1:
          r_ls, w_ls, x_ls = select(read_ls, [], [])
          for i in r_ls:
              if i is sk:
                  conn, addr = i.accept()
                  read_ls.append(conn)
              else:
                  ret = i.recv(1024)  #接收消息
                  if ret == b‘‘:
                      read_ls.remove(i)
                      i.close()
                      continue
                  print(ret)
                  i.send(b‘byebye!‘)  #发送消息
  • 客户端 -起多线程的客户端

      import socket
      from threading import Thread
    
      def func():
          sk = socket.socket()
          address = (‘127.0.0.1‘, 8080)
          sk.connect(address)
          sk.send(b‘hello‘)
          ret = sk.recv(1024)
          print(ret)
          sk.close()
    
      t_ls = []
      for i in range(10):
          t = Thread(target=func)
          t.start()    

其他类似的模块

poll -[Linux]

  • select机制基本上一样
  • 但是poll监听的对象比select监听上限多

epol -[Linux][Windows上没有 ]

  • 高端的
  • 并不是循环每一个项目进行监听
  • 而是为每一个项目增加回调函数
  • 有信号来直接进行回调函数,所以效率比循环高

以上是关于IO多路复用的主要内容,如果未能解决你的问题,请参考以下文章

你管这破玩意叫 IO 多路复用?

多路转接(IO复用)接口介绍

多路复用io接口-epoll

IO多路复用 -- selectpollepoll实现TCP反射程序

IO多路复用

经典5种IO模型 | IO多路复用