IO多路复用,以socket为例

import selectors  #导入selectors模式,不一样于select,它是基于select模块实现的IO多路复用,import socket     #导入的模块,用于服务端与用户端的交互sock =socket.socket() #sock.bind(('127.0.0.1',8083)) #sock.listen(5)sock.setblocking(False)sel =selectors.DefaultSelector() #根据使用平台自动选择最佳的IO多路复用机制,好比若是                                #在linux系统中,它会自动选择epoll.本系统是在win系统                                #上运行的,因此它选择的是select机制print('sel',sel) #<selectors.SelectSelector object at 0x0000000001E97B70>  #sel 是selectors在选择的IO多路机制下产生的对象def read(conn,mask):    try:        data =conn.recv(1024)        print(data.decode('utf-8'))        data2 =input('>>>:').strip()        conn.send(data2.encode('utf-8'))    except Exception:        sel.unregister(conn)def my_accept(sock,mask): #定义函数,函数的参数必须是两个,第一个是套接字,            #第二个是固定的mask,该套接字参数与定义的函数名,在注册事件时            #要是对应关系的,    conn,addr =sock.accept()    sel.register(conn,selectors.EVENT_READ,read)#sel.register(sock,selectors.EVENT_READ,my_accept)#注册事件#sel对象调用register方法,进行注册,必须输入三个参数,第一个必须是套接字,#第二个固定是selectors.EVENT_READ,第三个是与套接字绑定的函数名,#即第一个参数和第三个参数是本身设置的#下面的代码是固定的,不须要更改while True:    print('wating.....')    events =sel.select() #监听  [(key1,mask1),(key2,mask2)]    #把发生变化的元素赋值给event    for key,mask in events: #一旦触动套接字,就必须执行该函数,        obj =key.fileobj #文件描述符(套接字)赋值给obj        func =key.data   #文件描述符(套接字)绑定的函数赋值给func        func(obj,mask)   #执行绑定的函数
相关文章
相关标签/搜索