Python——IO多路复用之select模块epoll方法

Posted noonjuan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python——IO多路复用之select模块epoll方法相关的知识,希望对你有一定的参考价值。

Python——IO多路复用之select模块epoll方法

使用epoll方法实现IO多路复用,使用方法基本与poll方法一致,epoll效率要高于select和poll。

.
├── epoll_client.py
├── epoll_server.py
└── settings.py

# settings.py

HOST = localhost
PORT = 5555
buffersize = 1024
ADDR = HOST, PORT

 

# poll_server.py

from settings import *
from select import *
from socket import *

s = socket()
s.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)  # 设置端口可立即重用
s.bind(ADDR)
s.listen()

# 创建epoll对象
p = epoll()

# 创建地图(字典)
fdmap = s.fileno(): s

# 注册关注(事件)
p.register(s, EPOLLIN | EPOLLERR)
# EPOLLIN 对应select方法中的参数rlist         -> 等待处理的IO事件
# EPOLLOUT 对应select方法中的参数wlist     -> 主动处理的IO事件
# EPOLLERR 对应select方法中的参数xlist        -> 出错处理的IO事件

while True:
    # 进行IO监控
    # events = [(fileno, event), ...]
    try:
        events = p.poll()
    except KeyboardInterrupt:
        print(KeyboardInterrupt: Ctrl+C to exit)
        break

    for fd, event in events:
        if fd == s.fileno():
            # 从地图中找到fd对应的对象
            conn, addr = fdmap[fd].accept()
            print(Connect from, addr)
            # 注册关注
            p.register(conn, EPOLLIN)
            # 添加到地图中
            fdmap[conn.fileno()] = conn
        else:
            data = fdmap[fd].recv(buffersize)
            if not data:
                p.unregister(fd)  # 取消注册
                fdmap[fd].close()  # 关闭套接字
                del fdmap[fd]  # 从地图中删除
            else:
                print(fdmap[fd].getpeername(), data.decode())
                fdmap[fd].send(bRoger that!)
s.close()
print(El Fin)        

 

# client.py

from socket import *
from settings import *

s = socket()
s.connect(ADDR)

while True:
    data = input(>> )
    if not data:
        break
    s.send(data.encode())
    print(s.recv(buffersize).decode())

s.close()

 

以上是关于Python——IO多路复用之select模块epoll方法的主要内容,如果未能解决你的问题,请参考以下文章

Python IO多路复用select模块

IO多路复用之epoll总结

IO多路复用_selectors模块_python

python之IO多路复用——selectpollepoll详解

python使用select和epoll实现IO多路复用实现并发服务器

select模块select IO多路复用和select实现FTP