python IO多路复用代码

"""
IO多路复用, 就是自己做一个socket然后交给操作系统, 如果有消息,再去接受系统的消息, 因为操作系统比python快
"""

import socket
import selectors

sel = selectors.EpollSelector() #让系统去做接受消息, 开启linux系统 的Epoll

server = socket.socket() #创建套接字

server.bind(('127.0.0.1',8888))
server.listen(5)

print("开始监听")
#注册事件 当客户端链接了, 怎么办

def readable(conn):
data = conn.recv(1024)
print(data.decode())

def acc(server): # 这个函数名(形参) == callback(key.fileobj)
conn,addr = server.accept()
print("脸上的客户端:{}{}".format(conn,addr))
sel.register(conn,selectors.EVENT_READ,readable) #接收到一个客户端后, 然后在挂在系统上, 做一个消息处理对应的回调

#注册
sel.register(server,selectors.EVENT_READ,acc) #这几个参数的意思是, 1、socket类型的对象、 2、调用系统Epoll的接口 、读取里面的内容 3、读到系统接收到消息后产生的反应

while True:
events = sel.select()# 返回有变化的套接字 监听
for key,mask in events:
#print(key,mask) #key里面的东西有什么 socket IP 端口号, 和函数体(注册的毁掉函数)
callback = key.data #其中key。data就是注册的回调函数 data=<function acc at 0xb70f0bb4>) 1
callback(key.fileobj) #就是acc函数(实参 == <socket.socket fd=4, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 9999)>)

posted on 2018-03-22 11:09  袁佳佳  阅读(198)  评论(0编辑  收藏  举报

导航