161 python网络编程 - 单进程服务器(epoll版)
2023-09-11 14:15:43 时间
1. epoll的优点:
没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于1024
效率提升,不是轮询的方式,不会随着FD数目的增加效率下降。只有活跃可用的FD才会调用callback函数;即epoll最大的优点就在于它只管你“活跃”的连接,而跟连接总数无关,因此在实际的网络环境中,epoll的效率就会远远高于select和poll。
2. epoll使用参考代码
import socket
import select
# 创建套接字
s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
# 设置可以重复使用绑定的信息
s.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
# 绑定本机信息
s.bind(("",7788))
# 变为被动
s.listen(10)
# 创建一个epoll对象
epoll=select.epoll()
# 测试,用来打印套接字对应的文件描述符
# print s.fileno()
# print select.EPOLLIN|select.EPOLLET
# 注册事件到epoll中
# epoll.register(fd[, eventmask])
# 注意,如果fd已经注册过,则会发生异常
# 将创建的套接字添加到epoll的事件监听中
epoll.register(s.fileno(),select.EPOLLIN|select.EPOLLET)
connections = {}
addresses = {}
# 循环等待客户端的到来或者对方发送数据
while True:
# epoll 进行 fd 扫描的地方 -- 未指定超时时间则为阻塞等待
epoll_list=epoll.poll()
# 对事件进行判断
for fd,events in epoll_list:
# print fd
# print events
# 如果是socket创建的套接字被激活
if fd == s.fileno():
conn,addr=s.accept()
print('有新的客户端到来%s'%str(addr))
# 将 conn 和 addr 信息分别保存起来
connections[conn.fileno()] = conn
addresses[conn.fileno()] = addr
# 向 epoll 中注册 连接 socket 的 可读 事件
epoll.register(conn.fileno(), select.EPOLLIN | select.EPOLLET)
elif events == select.EPOLLIN:
# 从激活 fd 上接收
recvData = connections[fd].recv(1024)
if len(recvData)>0:
print('recv:%s'%recvData)
else:
# 从 epoll 中移除该 连接 fd
epoll.unregister(fd)
# server 侧主动关闭该 连接 fd
connections[fd].close()
print("%s---offline---"%str(addresses[fd]))
说明
- EPOLLIN (可读)
- EPOLLOUT (可写)
- EPOLLET (ET模式)
epoll对文件描述符的操作有两种模式:LT(level trigger)和ET(edge trigger)。LT模式是默认模式,LT模式与ET模式的区别如下:
LT模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll时,会再次响应应用程序并通知此事件。
ET模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll时,不会再次响应应用程序并通知此事件。
相关文章
- [Python]架设python虚拟环境以及部署PythonWeb服务
- 装13失败后,我决定使用Python为生僻字批量注音
- python中open函数的使用
- python paramiko ssh.exec_command()启动tomcat服务器应用进程失败问题解决方法- Neither the JAVA_HOME nor the JRE_HOME environment variable is defined At least one of these environment variable is needed to run this progr
- 终于用PYTHON作了一个实用于工作的脚本啦----通过邮件定时发送服务器空闲空间
- python分段算利润、税收
- python: 安装DeOldify库:黑白图片上色(Python 3.7.15)
- [LINK]Python服务器开发一:python基础
- Atitit python3.0 3.3 3.5 3.6 新特性 Python2.7新特性1Python 3_x 新特性1python3.4新特性1python3.5新特性1值得关注的新特性1Python3.6新特性2 Python2.7新特性Python 2.7的新特性 - 牛皮糖NewPtone - 博客园.html Python 3_x 新特性及10大变化_python_脚本之家.htm
- Python工作五年月薪23K,记录一下我的学习经历建议
- Python:利用python代码编程实现将视频的avi格式转换为MP4格式
- Qt调用Python详细过程
- 〖Python接口自动化测试实战篇⑬〗- 实战 - unittest框架之测试套件应用
- 牛客华为机试第1题python
- python 习题集锦
- Python从0到1丨图像增强及运算:形态学开运算、闭运算和梯度运算
- 遇见神器!cufflinks:一款美不胜收的 Python 可视化工具包!
- python之实现简单的ssl socket服务器
- (57)C#里的WEBAPI的客户端怎么样与Python服务器联调
- 接口自动化测试python+pytest+request+allure
- python基础===一行 Python 代码实现并行(转)
- python实战===2017年30个惊艳的Python开源项目 (转)
- python基础===Python性能优化的20条建议
- 〖Python自动化办公篇㉑〗- python实现邮件自动化 - 定时发送邮件
- 解决python使用pip安装包时出现WARNING: Ignoring invalid distribution -ip (f:python3.8libsite-packages)的问题
- Python调用shell命令方式