epoll et résumé

使用方法:基本与poll相同
生成对象改为epoll()
将所有事件类型改为EPOLL类型

epll特点
epoll 效率比select poll要高
epoll监控数量比select 要多
epoll的触发方式比pollduo(EPOLLET边缘触发)
"""
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)
#创建epoll对象
ep = epoll()
#建立查找字典,通过一个IO的fileno找到io对象
fdmap = {
    
    s.fileno():s}
#关注s
ep.register(s,EPOLLIN|EPOLLERR)
#循环监控IO发生
while True:
    fd,events = ep.poll()
    if fd == s.fileno():
        c,addr = fdmap[fd].accept()
        print('coonect from',addr)
        #关注客户端连接套接字
        ep.register(c,EPOLLIN|EPOLLERR)
        fdmap[c.fileno()]=c
    elif events & EPOLLIN:#判断是否为POLLIN就绪
        data=fdmap[fd].recv(1024).decode()
        if not data:
           ep.unregister(fd)#取消关注
           fdmap[fd].close()
           del fdmap[fd]#从字典删除
           continue
        print(data)
        fdmap[fd].send(b'ok')

La sélection et l'interrogation sont déclenchées horizontalement par défaut. Si le système d'exploitation surveille l'IO, il enverra l'IO à traiter à la couche application. Si la couche application ne la traite pas, elle continuera à l'envoyer jusqu'à ce que le front de traitement se déclenche. Au contraire,

おすすめ

転載: blog.csdn.net/qq_42307546/article/details/132924755