本节内容

1:Python/selectors模块

2:selsect实例

1:Python/selectors模块及队列

 selectors模块是可以实现IO多路复用机制:

它具有根据平台选出最佳的IO多路机制,比如在win的系统上他默认的是select模式而在linux上它默认的epoll。

  1. 常用IO多路复用共分为三种:
  2.  
  3. selectpollepoll
  4.  
  5. windows上只支持select,而linux上都支持

select的缺点:

1、每次调用都要将所有的文件描述符(fd)拷贝的内核空间,导致效率下降

2、遍历所有的文件描述符(fd)查看是否有数据访问

3、最大链接数限额(1024)

poll:

它就是select和epoll的过渡阶段,它没有最大链接数的限额

epoll:

1、第一个函数是创建一个epoll句柄,将所有的描述符(fd)拷贝到内核空间,但只拷贝一次。

2、回调函数,某一个函数或某一个动作成功完成之后会触发的函数为所有的描述符(fd)绑定一个回调函数,一旦有数据访问就是触发该回调函数,回调函数将(fd)放到链表中

3、函数判断链表是否为空

4、最大启动项没有限额

2:selsect实例:

  1. ###服务端################
  2.  
  3. import selectors #基于select模块实现的IO多路复用,建议大家使用
  4. import socket
  5. sock=socket.socket()
  6. sock.bind(('127.0.0.1',8800))
  7. sock.listen(5)
  8. sock.setblocking(False)
  9. sel=selectors.DefaultSelector() #根据平台选择最佳的IO多路机制,比如linux就会选择epoll
  10.  
  11. def read(conn,mask):
  12. try:
  13. data=conn.recv(1024)
  14. print(data.decode('utf8'))
  15. data2=input('>>>>')
  16. conn.send(data2.encode('utf8'))
  17. except Exception:
  18. sel.unregister(conn)
  19.  
  20. def accept(sock,mask):
  21. conn,addr=sock.accept()
  22. print('-------',conn)
  23. sel.register(conn,selectors.EVENT_READ,read)
  24.  
  25. sel.register(sock, selectors.EVENT_READ, accept) #注册功能,一旦有反应继续往下执行
  26.  
  27. while True:
  28. print('wating....')
  29. events=sel.select() #event和select的监听对象[(sock),(),()]一样,都是在监听
  30.  
  31. for key,mask in events:
  32. # print(key.data) #accept 找出有活动的绑定函数
  33. # print(key.fileobj) #sock 找出有活动的文件描述符
  34.  
  35. func=key.data
  36. obj=key.fileobj
  37.  
  38. func(obj,mask) #1 accept(sock,mask) 2read(conn,mask)
  39.  
  40. ##客户端#################
  41. import socket
  42. tin=socket.socket()
  43. tin.connect(('127.0.0.1',8800))
  44. while True:
  45. inp=input('>>>>')
  46. tin.send(inp.encode('utf8'))
  47. data=tin.recv(1024)
  48. print(data.decode('utf8'))

Day15 - Python基础15 模块学习-selectors的更多相关文章

  1. Day11 - Python基础11 模块学习——optparse

    Python 有两个内建的模块用于处理命令行参数: 一个是 getopt,<Deep in python>一书中也有提到,只能简单处理 命令行参数: 另一个是 optparse,它功能强大 ...

  2. 十五. Python基础(15)--内置函数-1

    十五. Python基础(15)--内置函数-1 1 ● eval(), exec(), compile() 执行字符串数据类型的python代码 检测#import os 'import' in c ...

  3. python基础——第三方模块

    python基础——第三方模块 在Python中,安装第三方模块,是通过包管理工具pip完成的.  如果你正在使用Mac或Linux,安装pip本身这个步骤就可以跳过了.  如果你正在使用Window ...

  4. python基础——使用模块

    python基础——使用模块 Python本身就内置了很多非常有用的模块,只要安装完毕,这些模块就可以立刻使用. 我们以内建的sys模块为例,编写一个hello的模块: #!/usr/bin/env ...

  5. 二十五. Python基础(25)--模块和包

    二十五. Python基础(25)--模块和包 ● 知识框架   ● 模块的属性__name__ # my_module.py   def fun1():     print("Hello& ...

  6. python中confIgparser模块学习

    python中configparser模块学习 ConfigParser模块在python中用来读取配置文件,配置文件的格式跟windows下的ini配置文件相似,可以包含一个或多个节(section ...

  7. python 基础之 模块

    Python 基础之模块 一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 就是一个python文件中定义好了类和方法,实现了一些功能,可以被别的python文 ...

  8. Day15 Python基础之logging模块(十三)

    参考源:http://www.cnblogs.com/yuanchenqi/articles/5732581.html logging模块 (****重点***) 一 (简单应用) import lo ...

  9. 学习PYTHON之路, DAY 6 - PYTHON 基础 6 (模块)

    一 安装,导入模块 安装: pip3 install 模块名称 导入: import module from module.xx.xx import xx from module.xx.xx impo ...

随机推荐

  1. MariaDB修改配置文件允许远程访问

    MariaDB修改配置文件允许远程访问 最近在使用MariaDB数据库配置用户的远程访问的时候,遇到了一个坑,费了些功夫解决了一下,特此写一下博客,以防下次再遇到的时候忘了解决方案,废话不多说,我们直 ...

  2. 【CF528D】Fuzzy Search

    Problem Description 你有一个长度为 \(n\) 的串 \(S\),以及长度为 \(m\) 的串 \(T\). 现给定一个数 \(k\) ,我们说 \(T\) 在 \(S\) 的位置 ...

  3. 在IIS上部署 .Net Core 3.0 项目踩坑实录

    在IIS上部署 .Net Core 3.0 项目的主要流程有: 安装并启用IIS 安装AspNetCoreModuleV2 添加.配置网站 设置应用程序池 通过VS发布 一.安装并启用IIS: 安装了 ...

  4. 设计模式之单例模式(Java)

    单例模式 问题 多线程操作同一对象保证对象的一致性 解决思路 只有一次实例化过程,产生一个实例化对象,并提供返回该对象的方法. 单例模式的分类 1 饿汉式 在加载类的时候就产生实例对象 public ...

  5. Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  6. C# ling to sql 取多条记录最大时间

    var _setList = (from f in _postgreDbContext.settlements group f by ( new { f.settlement_code })into ...

  7. NETGEAR R7800路由器TFTP刷回原厂固件方法

    前几天因图新鲜将用了一年的R7800刷为dd-wrt固件,结果发现信号覆盖和网络速率相对于原厂固件还有一些差距. 然后从dd-wrt固件刷回原厂,具体操作过程如下: 1.到NETGEAR官网[支持]模 ...

  8. JAVA开发几个常用快捷键

  9. 网页前端之CSS学习记录总结篇

    标签: 块级标签block:div, p, h1-h6, ul, ol,li, dl, dt, dd,table,tr等,独占一行,可以设置宽高,默认是父标签的100%:行内标签inline:a,sp ...

  10. Web开发跨域问题

    什么是域?    协议,  ip(域名). 端口 前端:域  后端:域   js 进行跨域请求, 因为浏览器的同源策略,导致了两个不同域请求出错 浏览器 会尝试向后端发送 option 请求, --- ...