python的select和epoll

1.select模型:

  • linux中每个套接字都是文件,都有唯一的文件描述符,这些设备的文件描述符被放在一个数组中,然后select调用的时候遍历这个数组,如果对于的文件描述符可读则会返回改文件描述符。当遍历结束之后,如果仍然没有一个可用设备文件描述符,select让用户进程则会睡眠,直到等待资源可用的时候在唤醒,遍历之前那个监视的数组。每次遍历都是以轮询的方式依次进行判断的。

select实现回显服务器:


from socket import *
from select import * s = socket(2,1)
s.setsockopt(1,2,1)
s.bind(('',8080))
s.listen(1024) s_list = [s.fileno(),] #fileno()获取套接字的唯一描述符,每个套接字都是唯一不同的
s_dict = {} while 1:
list_readable,a,b = select(s_list,[],[]) #分别对应: 输入,输出,错误输出
for i in list_readable:
if i == s.fileno():
conn,userinfo = s.accept()
s_list.append(conn.fileno())
s_dict[conn.fileno()] = conn
else:
cs = s_dict[i]
recv_data = cs.recv(1024)
if len(recv_data) <= 0:
s_dict[i].close()
s_dict.pop(i)
s_list.remove(i)
else:
cs.send(recv_data)

2.epoll模型:

  • select模型会受到文件描述符数量的限制,所以一般最多是1024个套接字,而epoll突破了此限制。
  • epoll采用的是事件通知机制,而不再是以轮询的方式挨个询问每个文件描述符的状态,节省cpu时间。
  • epoll是select的进阶版。一般情况下epoll效率更高

epoll实现回显服务器:


from socket import *
from select import * s = socket(2,1)
s.setsockopt(1,2,1)
s.bind(('',8080))
s.listen(1024) s_dict = {} epoll_instance = epoll()
epoll_instance.register(s.fileno(),EPOLLIN|EPOLLET)
while 1:
epoll_list = epoll_instance.poll()
for fd,event in epoll_list:
if fd == s.fileno():
cs,userinfo = s.accept()
epoll_instance.register(cs.fileno(),EPOLLIN|EPOLLET)
s_dict[cs.fileno()] = cs
else:
cs = s_dict[fd]
recv_data = cs.recv(1024)
print(recv_data.decode('gb2312'))
if len(recv_data) > 0 :
cs.send(recv_data)
else:
print('adsfasdf')
epoll_instance.unregister(fd)
cs.close()
s_dict.pop(fd)
  • 注:EPOLLIN(可读),EPOLLOUT(可写)
  • EPOLLET: 边缘触发模式(只通知一次)
  • EPOLLLT:水平触发模式(通知后没有做处理的话还会继续通知)

最新文章

  1. Operation not allowed after ResultSet closed--操作mysql数据库
  2. sqlserver 2008R2数据库迁移oracle
  3. 图解atime/mtime/ctime之间的区别与联系
  4. Struts2中Action接收参数的四种形式
  5. WEKA运行LIBSVM出现problem evaluating classifier:rand
  6. ios7 tableview scrollsToTop 不执行处理方法
  7. mediawiki的安装与配置
  8. 通过HttpClient来调用Web Api接口
  9. 多进程解决datasnap支持的tcp长连接数量少的问题
  10. Page类成员
  11. careercup-链表 2.7
  12. 利用fiddler录制脚本
  13. Android服务端本地窗口FramebufferNativeWindow
  14. HDU 5095 Linearization of the kernel functions in SVM(模拟)
  15. git学习四:eclipse使用git提交项目
  16. Ali OSS服务端签名直传并设置上传回调
  17. 在虚拟机中搭建qduoj(一)——准备工作
  18. Python 爬虫利器 Selenium 介绍
  19. React Native常用第三方组件汇总--史上最全[转]
  20. SQL去重之distinct和group by的应用

热门文章

  1. hadoop 安装教程
  2. 前端PHP入门-032-异常处理-应用级别
  3. nova-virt与libvirt
  4. libuv移植到android
  5. 深入探索C++对象模型(七)
  6. rabbitmq常见运维命令和问题总结
  7. elasticsearch ik中文分词器的安装配置使用
  8. asp.net DataTable导出 excel的方法记录(第三方)
  9. 【BZOJ】3998: [TJOI2015]弦论
  10. SPI协议及其工作原理浅析【转】