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上没有 ]

  • 高端的
  • 并不是循环每一个项目进行监听
  • 而是为每一个项目增加回调函数
  • 有信号来直接进行回调函数,所以效率比循环高
posted @ 2018-10-06 11:08  小白的蟒蛇  阅读(135)  评论(0)    收藏  举报