selectors模块是可以实现IO多路复用机制:

它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll。

select模块,提供了:select、poll、epoll三个方法,分别调用系统的 select,poll,epoll 从而实现IO多路复用。

  Windows Python:提供: select
  Mac Python:提供: select
  Linux Python:提供: select、poll、epoll

格式:rList,wList,eList = select.select(argv1,argv2,argv3,timeout)

参数:

  argv1:监听序列中的句柄发生变化时,则获取发生变化的句柄添加到rList序列中

  argv2:监听序列中含有句柄时,则将该序列中所有的句柄添加到wList序列中

  argv3:监听序列中的句柄发生错误时,则将该发生错误的句柄添加到eList序列中

  timeout:设置阻塞时间,如果不设置则默认一直阻塞

概念

监听多个描述符的状态,如果描述符状态改变,则会被内核修改标志位,从而被进程获取进而进行读写操作

 

 

服务端
import selectors  #基于select模块实现的IO多路复用,建议大家使用
import socket
sock=socket.socket()
sock.bind(('127.0.0.1',8800))
sock.listen(5)
sock.setblocking(False)
sel=selectors.DefaultSelector() #根据平台选择最佳的IO多路机制,比如linux就会选择epoll

def read(conn,mask):
    try:
        data=conn.recv(1024)
        print(data.decode('utf8'))
        data2=input('>>>>')
        conn.send(data2.encode('utf8'))
    except Exception:
        sel.unregister(conn)

def accept(sock,mask):
    conn,addr=sock.accept()
    print('-------',conn)
    sel.register(conn,selectors.EVENT_READ,read)
sel.register(sock, selectors.EVENT_READ, accept)  #注册功能
while True:
    print('wating....')
    events=sel.select()   #[(sock),(),()]   监听

    for key,mask in events:
        # print(key.data)       #accept   找出有活动的绑定函数
        # print(key.fileobj)    #sock     找出有活动的文件描述符

        func=key.data
        obj=key.fileobj

        func(obj,mask)  #1 accept(sock,mask) 2read(conn,mask)
------------------------------------------------------------------------------
客户端
import socket
tin=socket.socket()
tin.connect(('127.0.0.1',8800))
while True:
    inp=input('>>>>')
    tin.send(inp.encode('utf8'))
    data=tin.recv(1024)
    print(data.decode('utf8'))

 

posted on 2019-07-16 14:37  天0涯  阅读(228)  评论(0编辑  收藏  举报