zoukankan      html  css  js  c++  java
  • 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) #执行绑定的函数
  • 相关阅读:
    HDU 4901 The Romantic Hero
    COGS8 备用交换机
    POJ 1466 Girls and Boys
    bzoj3442 学习小组
    bzoj2054 疯狂的馒头
    POJ2135 Farm Tour
    POJ 1149 PIGS
    Html5 Canvas学习之路(五)
    关于跨域简单总结
    vue-baidu-map 进入页面自动定位的解决方案!
  • 原文地址:https://www.cnblogs.com/IQ-Python/p/6845821.html
Copyright © 2011-2022 走看看