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'))
  • 相关阅读:
    2019重新起航:搭建个人博客
    Alibaba Nacos:搭建Nacos平台
    ELK:使用docker搭建elk平台
    SpringBoot:关于默认连接池Hikari的源码剖析
    git常用命名:自用,持续更新
    linux常用命名汇总:自用,持续更新
    升级项目版本:SpringBoot1.5.x到SpringBoot2.0.x
    Python学习第十五课——类的基本思想(实例化对象,类对象)
    Python学习第十三课——re(正则表达式)模块
    Python学习第十四课——面向对象基本思想part1
  • 原文地址:https://www.cnblogs.com/lides/p/11194795.html
Copyright © 2011-2022 走看看