码迷,mamicode.com
首页 > 编程语言 > 详细

IO多路复用_selectors模块_python

时间:2020-03-15 11:52:50      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:epo   net   断开连接   div   tip   puts   host   author   mask   

一、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

标签:epo   net   断开连接   div   tip   puts   host   author   mask   

原文地址:https://www.cnblogs.com/chenxiaozan/p/12496414.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!