poll方法01

p = select.poll()
功能: 创建poll对象
返回值: poll对象
p.register(fd,event)
功能: 注册关注的io事件
参数: fd 要关注的IO
event 要关注的io事件类型
通用类型: POLLIN 读io事件
pollout 写io事件
pollerr 异常IO
POLLHUP 断开连接
p.register(sockfd,POLLIN|POLLERR)

p.unregister(fd)
功能: 取消对io的关注
"""
poll_server.py 完成tcp并发服务
Io多路复用实现并发建立fileno --> io对象字典用于io查找
"""
from select import *
from socket import *
s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
s.bind(('0.0.0.0',4444))
s.listen(3)
#创建poll对象
p = poll()
#建立查找字典,通过一个IO的fileno找到io对象
fdmap = {
    
    s.fileno():s}
#关注s
p.register(s,POLLIN|POLLERR)
#循环监控IO发生
while True:
    fd,events = p.poll()
    if fd == s.fileno():
        c,addr = fdmap[fd].accept()
        print('coonect from',addr)
        #关注客户端连接套接字
        p.register(c,POLLIN|POLLERR)
        fdmap[c.fileno()]=c
    elif events & POLLIN:#判断是否为POLLIN就绪
        data=fdmap[fd].recv(1024).decode()
        if not data:
            p.unregister(fd)#取消关注
            fdmap[fd].close()
            del fdmap[fd]#从字典删除
            continue
        print(data)
        fdmap[fd].send(b'ok')

猜你喜欢

转载自blog.csdn.net/qq_42307546/article/details/132912626