网络:IO
1、IO
input output,IO就是输入输出
在内存中存在数据交换的操作可以认为是IO操作(输入输出)
eg:
【1】内存和磁盘进行数据交换:
文件的读写, 数据库更新
【2】内存和终端数据交换 :
input 、print
sys.stdin、 sys.stdout、 sys.stderr
【3】内存和网络数据的交换:
网络连接, recv、 send、 recvfrom等
2、IO密集型程序与CPU(计算)密集型程序
【1】IO密集型程序 :
程序执行中有大量的IO操作,而较少的cpu 运算操作。消耗cpu较少,IO运行时间长
【2】CPU(计算)密集型程序:
程序中存在大量的cpu运算,IO操作相对较少,消耗cpu大。
3、IO分类
阻塞IO 、非阻塞IO 、IO多路复用、 事件驱动IO 、异步IO
【1】阻塞IO :
程序运行中遇到IO条件没有达成或者传输过从较慢的情况会出现阻塞状态
① 阻塞IO是 IO最简单的逻辑情形,也是默认状态
② 阻塞IO是效率很低的IO形态
【阻塞情况】
① 因为某种IO条件没有达到形成阻塞
eg: accept、 recv、 recvfrom、 input
② 处理IO事件的时候耗时较长形成阻塞
eg: 文件读写过程, 网络数据发送过程
【2】非阻塞IO :
在程序运行中遇到IO的情形不让其产生阻塞
【实现手段】
① 改变IO事件的属性,使其变为非阻塞
② 通常会和循环一起使用,尽心条件的循环监控
sock.setblocking(False)
功能 : 将套接字设置为非阻塞
参数 : 默认True,为阻塞状态。设置为False则为非阻塞
【套接字超时检测 】
将原本阻塞的函数,设置一个阻塞的最长时间。
在时间内如果仍然阻塞则不再等待
sock.settimeout(sec)
参数 : 时间 (秒)
功能 : 设置套接字的超时时间
from socket import * import time s = socket() s.bind(('127.0.0.1',8888)) s.listen(5) #将IO设置为非阻塞 s.setblocking(False) while True: print("Waiting for connect...") try: c,addr = s.accept() except BlockingIOError: time.sleep(2) print(time.ctime()) continue print("Connect from",addr) # c.setblocking(False) while True: data = c.recv(1024).decode() if not data: break print(data) c.close() s.close()
from socket import * #创建套接字 sockfd = socket() #发起连接 sockfd.connect(('127.0.0.1',8888)) while True: #消息收发 msg = input("Msg>>") if not msg: break sockfd.sendall(msg.encode()) data = sockfd.recv(1024) print(data.decode()) sockfd.close()
【3】IO多路复用
通过一个监测,可以同时监控多个IO事件,
当哪个IO事件可以执行,即让这个IO事件发生,这就是IO多路复用
【IO事件就绪】
IO事件即将发生的一个临界状态
① 在程序中存在的IO事件中选择要监测的
② 创建监测,将监测的IO事件注册
③ 等待监测的IO时间发生,判断是什么IO事件
④ 处理相应的IO
【多路复用的实现】
https://www.cnblogs.com/longyuu/p/14234690.html
select模块。
select() ---> windows linux unix
poll() ---> linux unix
epoll() ---> linux unix
【4】
【5】