epoll版-TCP服务器

1. epoll的优点:

  1. 没有最大并发连接的限制,能打开的FD(指的是文件描述符,通俗的理解就是套接字对应的数字编号)的上限远大于1024
  2. 效率提升,不是轮询的方式,不会随着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()] = connaddresses[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 中移除该 连接 fdepoll.unregister(fd)# server 侧主动关闭该 连接 fdconnections[fd].close()print("%s---offline---"%str(addresses[fd]))

2. 说明

  • EPOLLIN (可读)
  • EPOLLOUT (可写)
  • EPOLLET (ET模式)

epoll对文件描述符的操作有两种模式:LT(level trigger)和ET(edge trigger)。LT模式是默认模式,LT模式与ET模式的区别如下:

LT模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序可以不立即处理该事件。下次调用epoll时,会再次响应应用程序并通知此事件。ET模式:当epoll检测到描述符事件发生并将此事件通知应用程序,应用程序必须立即处理该事件。如果不处理,下次调用epoll时,不会再次响应应用程序并通知此事件。

单进程epoll版-TCP服务器(python 版)相关推荐

  1. 单进程select版-TCP服务器(python 版)

    select版-TCP服务器 1. select 原理 在多路复用的模型中,比较常用的有select模型和epoll模型.这两个都是系统接口,由操作系统提供.当然,Python的select模块进行了 ...

  2. 单进程gevent版-TCP服务器(python 版)

    gevent版-TCP服务器 import sys import time import geventfrom gevent import socket,monkey monkey.patch_all ...

  3. gevent版TCP服务器

    gevent版-TCP服务器 import sys import time import geventfrom gevent import socket,monkey # 猴子补丁,在执行时动态替换 ...

  4. 18-ESP8266 SDK开发基础入门篇--TCP 服务器 RTOS版,串口透传,TCP客户端控制LED

    https://www.cnblogs.com/yangfengwu/p/11112015.html 先规定一下协议 aa 55 02 01 F1 4C 控制LED点亮  F1 4C为CRC高位和低位 ...

  5. 单进程服务器-select版

    select版-TCP服务器 1. select 原理 在多路复用的模型中,比较常用的有select模型和epoll模型.这两个都是系统接口,由操作系统提供.当然,Python的select模块进行了 ...

  6. Python版插入排序算法

    问题描述:在插入排序算法中,把所有元素分为前面的已排序序列和后面的未排序序列两部分,每次处理未排序序列中的第一个元素,将其插入到前面已排序序列中的合适位置,从而不停地扩大已排序序列并缩小未排序序列,直 ...

  7. python计算gpa,Python版GPA计算器

    最近在网申投简历时遇到一个需要计算GPA的问题,想起自己在上学时写的Excel公式版GPA计算器略显low,而且操作也比较复杂,于是一时兴起,写了个Python版的,在此分享给大家! 准备工作: 用户 ...

  8. linux桌面版和服务器版区别_简单普及一些linux和windows的区别,减少新入手一些云服务时的不适应...

    近一年,发的linux或者服务器之类的教程资源相对比较多,被问到一些令人头大的一些问题,也不知道怎么回答,可能需要稍微普及一点linux和windows的区别,虽然自己也是新人半桶水. 1.windo ...

  9. 单进程服务器(python版)

    单进程服务器 1. 完成一个简单的TCP服务器 from socket import *serSocket = socket(AF_INET, SOCK_STREAM)# 重复使用绑定的信息 serS ...

最新文章

  1. 理解计算机视觉中的损失函数
  2. 程序员如何优雅地使用 Mac? - OS X - 知乎
  3. Python 中 pass的使用
  4. 超级有趣的七个 404 错误页面设计
  5. Hadoop 核心编程之 HDFS 的文件操作
  6. pta龟兔赛跑Java_PTA-龟兔赛跑
  7. rh php56 php,在全球范围内提供RHSCL PHP的最佳方法
  8. SpringCloudGateway起步
  9. ubuntu20.10创建QT应用程序快捷方式 Terminal中输入命令直接打开QtCreator
  10. perl学习笔记(8)
  11. iOS之友盟简单分享(第三方)及sso授权问题
  12. argparse模块
  13. 设计模式之——建造者模式
  14. php向redis list一次性lpush多个值
  15. 请求服务器获取微信openid,Golang通过小程序获取微信openid的方法示例
  16. 大前端学习工具及网站大全
  17. 我的 2020 总结:Never Settle
  18. 为什么说社群团购时代来临了?
  19. 微信小程序base64图片转换临时链接
  20. twig php,Twig模板引擎用法入门教程

热门文章

  1. Nginx进程间通信机制
  2. react全家桶实现招聘app-项目准备(一)
  3. 4.Windows Server2012 R2里面部署 MVC 的网站
  4. [.net 面向对象程序设计深入](36)Redis——基础
  5. Several ports (8005, 8080, 8009) required by Tomcat v7.0 Server at localhost are解决方法
  6. Linux磁盘管理2
  7. Webview中无法触发手势方法(ontouchevent,onfling...)的解决方法
  8. [Linux学习]man page常用按键
  9. IPSEC ×××需要解决的路由问题及影响IPSEC ×××的网络问题
  10. 周立功-成功心法(1):低年级大学生如何查资料写论文