zoukankan      html  css  js  c++  java
  • python selectors模块多路复用

    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'))
  • 相关阅读:
    install jqdatasdk
    分布式唯一ID自增(雪花算法)
    JVM内存布局及GC知识
    double涉及大数据的时候会变成科学计数法
    IDEA中的JUNIT测试
    spring boot 整合 swagger2
    springboot 报错nested exception is java.lang.IllegalStateException: Failed to check the status of the service xxxService No provider available for the service
    解决jar包依赖冲突(idea)
    IDEA中springboot的热部署
    Exception in thread "main" java.lang.AbstractMethodError: org.springframework.boot.context.config.ConfigFileApplicationListener.supportsSourceType(Ljava/lang/Class;)Z
  • 原文地址:https://www.cnblogs.com/lides/p/11194795.html
Copyright © 2011-2022 走看看