zoukankan      html  css  js  c++  java
  • IO多路复用_selectors模块_python

    一、selectors模块简介

    它的功能与linux的epoll,还是select模块,poll等类似;实现高效的I/O multiplexing,  常用于非阻塞的socket的编程中;

    相当于封装好的select和epoll,适用于不同的平台,如果支持epoll的平台自动选择epoll,否则会找select。

    二、简单的例子:

    server:

     1 import selectors
     2 import socket
     3 sel=selectors.DefaultSelector()  #创建一个selectors实例
     4 
     5 def interation(conn,mask):
     6     '''
     7     :param conn:活跃的conn
     8     :return:
     9     '''
    10     print(mask)
    11     try:
    12         data=conn.recv(1024)
    13         if data:
    14             print('data:',data)
    15             conn.send(data)
    16         else:
    17             print('连接已关闭',conn)
    18             sel.unregister(conn)
    19             conn.close()
    20     except ConnectionResetError as e:
    21         print('断开连接',conn)
    22         sel.unregister(conn)
    23         conn.close()
    24 def accept(server,mask):
    25     print(mask)
    26     conn,addr=server.accept()  #生成新的通道
    27     conn.setblocking(0)  #设置非阻塞模式
    28     sel.register(conn,selectors.EVENT_READ,interation)  #将通道注册加入检测行列,,设置活跃之后调用interation函数
    29 
    30 
    31 
    32 server=socket.socket()
    33 server.bind(('localhost',9888))
    34 server.listen()
    35 server.setblocking(0)
    36 sel.register(server,selectors.EVENT_READ,accept) #将server连接注册
    37 
    38 while True:
    39     events=sel.select()  #开始进行检测哪些连接有数据
    40     #print(events)#[(SelectorKey(fileobj=<socket.socket fd=464, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9888)>, fd=464, events=1, data=<function accept at 0x0000022F8C383048>), 1)]
    41     for key,mask in events:  #读写操作是否就绪的mask掩码,key是活跃的socket连接
    42         callback=key.data  #注册时的回调函数,就是获取的accept函数 或者是interation函数
    43         callback(key.fileobj,mask)  #执行回调函数,key.fileobj文件句柄,相当于生成conn的前一步

    client:

    #!/usr/bin/env python
    # _*_ coding:utf-8 _*_
    #Author:chenxz
    import socket
    def client():
        while True:
            client=socket.socket()
            client.connect(('localhost',9888))
            inputs=input('请输入:')
            client.send(inputs.encode('utf-8'))
            receive=client.recv(1024)
            print(receive)
            client.close()
    
    if __name__ == '__main__':
        client()
     
  • 相关阅读:
    SortedList的使用示例
    oracle 查询
    sql group by统计
    删除隐藏盘符的隐藏共享,打开隐藏盘符
    【C#】Entity Framework 增删改查和事务操作
    CSS rem长度单位
    HTML 页面meta标签
    VUE 生成二维码(qrcodejs)
    VUE 密码验证与提示
    JavaScript 加解密库(crypto-js)
  • 原文地址:https://www.cnblogs.com/chenxiaozan/p/12496414.html
Copyright © 2011-2022 走看看