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

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

时间:2019-08-01 13:06:35      阅读:79      评论:0      收藏:0      [点我收藏+]

标签:out   关闭   event   das   hat   重用   send   int   inpu   

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方法

标签:out   关闭   event   das   hat   重用   send   int   inpu   

原文地址:https://www.cnblogs.com/noonjuan/p/11281780.html

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