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()

 

 

posted on 2020-03-15 10:53  陈小赞  阅读(212)  评论(0编辑  收藏  举报

导航