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

IO多路复用

时间:2018-10-06 13:21:09      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:get   lse   .so   else   from   for   参数   code   tin   

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多路复用

标签:get   lse   .so   else   from   for   参数   code   tin   

原文地址:https://www.cnblogs.com/liliudong/p/9746912.html

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