python3网络编程03

IO input output
在内存中存在数据交换的操作可以认为是IO操作(输入输出)
e.g.
内存和磁盘进行数据交换:文件的读写 数据库更新
内存和终端数据交换 : input print
sys.stdin sys.stdout sys.stderr
和磁盘交互:read write
内存和网络数据的交换: 网络连接 recv send recvfrom
IO密集型程序 : 程序执行中有大量的IO操作,而较少的cpu运算操作。消耗cpu较少,IO运行时间长
CPU(计算)密集型程序:程序中存在大量的cpu运算,IO操作相对较少,消耗cpu大。
IO分类
阻塞IO 非阻塞IO IO多路复用 事件驱动IO 异步IO
阻塞IO : 程序运行中遇到IO条件没有达成或者传输过从较慢的情况会出现阻塞状态

  • 阻塞IO是 IO最简单的逻辑情形,也是默认状态
  • 阻塞IO是效率很低的IO形态
    阻塞情况 :
  • 因为某种IO条件没有达到形成阻塞
    e.g. accept recv recvfrom input
  • 处理IO事件的时候耗时较长形成阻塞
    e.g. 文件读写过程, 网络数据发送过程

非阻塞IO : 在程序运行中遇到IO的情形不让其产生阻塞
实现手段: 改变IO事件的属性,使其变为非阻塞

  • 通常会和循环一起使用,尽心条件的循环监控
    s.setblocking(False)
    功能 : 将套接字设置为非阻塞
    参数 : 默认为阻塞状态 设置为False则为非阻塞

超时检测
将原本阻塞的函数,设置一个阻塞的最长时间。在时间内如果仍然阻塞则不再等待
s.settimeout(sec)
功能 : 设置套接字的超时时间
参数 : 时间 (秒)
IO多路复用
定义 :通过一个监测,可以同时监控多个IO事件的行为。
当哪个IO事件可以执行,即让这个IO事件发生。
IO事件就绪: IO事件即将发生的一个临界状态

  • 在程序中存在的IO事件中选择要监测的
  • 创建监测,将监测的IO事件注册
  • 等待监测的IO时间发生,判断是什么IO事件
  • 处理相应的IO
    1:将IO设置为关注IO
    2:将关注IO提交给内核监测
    3:处理内核给我们反馈的准备就绪的IO

import select
select —》 windows linux unix
poll —》 linux unix
epoll —》 linux unix

rs, ws, xs = select(rlist, wlist, xlist[, timeout])
功能 :监控IO事件,阻塞等待监控的IO时间发生
参数 : rlist 列表 存放我们需要等待处理的IO
wlist 列表 存放我们想主动处理的IO
xlist 列表 存放出错希望去处理的IO
timeout 超时检测

返回值: rs 列表 rlist中准备就绪的IO
ws 列表 wlist中准备就绪的IO
xs 列表 xlist中准备就绪的IO

  • 在处理IO时不要形成死循环,让一个客户端单独占有服务 端
  • IO多路复兴形成一种可以同时处理多个IO的效果,效率较 高

位运算
按照二进制位进行运算操作

& 按位与 | 按位或 ^ 按位异或

<< 左移 >> 右移

11 1011
14 1110

& 1010 一0则0
| 1111 一1则1
^ 0101 相同0不同1

11 << 2 ===> 44 右侧补0 左移乘以2**2
14 >> 2 ===> 3 挤掉右侧的数字 右移除以2*2
使用 :1. 在做底层硬件时操作寄存器
2. 做标志位的过滤
poll方法实现IO多路复用

  1. 创建poll对象
    p = select.poll()

  2. 注册关注的IO
    p.register(s,POLLIN | POLLERR)
    p.unregister(s) 取消IO关注

事件类别
POLLIN POLLOUT POLLERR POLLHUP POLLPRI
rlist wlist xlist 断开 紧急处理

  1. 监控IO,阻塞等待IO发生
    events = p.poll() 阻塞函数
    功能个: 监控关注的IO事件
    返回值: 返回发生的IO事件
    events 是一个列表 [(fileno,evnet),(),()…]
    每个就绪IO对应列表中一个元组:(描述符,就绪事件)
    IO地图 : {s.fileno(): s}

  2. 处理IO事件

猜你喜欢

转载自blog.csdn.net/qq_34237321/article/details/84452513