IO多路复用_selectors模块_python

Posted 陈小赞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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()

 

 

以上是关于IO多路复用_selectors模块_python的主要内容,如果未能解决你的问题,请参考以下文章

python IO 多路复用

Day15 - Python基础15 模块学习-selectors

python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors

python开发IO模型:阻塞&非阻塞&异步IO&多路复用&selectors

Python/selectors模块

Python-IO多路复用