并发05--网络IO模型
并发05--网络IO模型
IO模型简介# 我们这里研究的IO模型都是针对网络IOStevens在文章中一共比较了五种IO Model: * blocking IO 阻塞IO * nonblocking IO 非阻塞IO * IO multiplexing IO多路复用 * asynchronous IO 异步IO * signal driven IO 信号驱动IO # 由signal driven IO(信号驱动IO)在实际中并不常用,所以主要介绍其余四种IO Model# 1.等待数据准备 (Waiting for the data to be ready)# 2.将数据从内核拷贝到进程中(Copying the data from the kernel to the process)同步异步阻塞非阻塞# 常见的网络阻塞状态: accept # tcp的等待链接 recv # tcp的接受数据 recvfrom # udp的接受数据 send # 虽然它也有io行为 但是不在我们的考虑范围(是主动的操作,且IO时间短)
?简单的网络数据传输过程-图解
recv的过程(被动的等待):
官方图解
# 阻塞IO模型 程序在接受到数据之前,都处于阻塞状态,只有接受到数据后,才会往下执行 # 我们之前写的都是阻塞IO模型 协程除外import socket# 服务端server = socket.socket()server.bind(('127.0.0.1',8080))server.listen(5)while True: conn, addr = server.accept() while True: try: data = conn.recv(1024) if len(data) == 0:break print(data) conn.send(data.upper()) except ConnectionResetError as e: break conn.close() # 客户端import socketclient = socket.socket()client.connect(('127.0.0.1', 8080))while True: client.send(b'hello world') data = client.recv(1024) print(data) # 在服务端开设多进程或者多线程 进程池线程池 其实还是没有解决网络IO问题 该等的地方还是得等 没有规避 每个人都会在该等的地方,还是会等待,只不过多个人等待的彼此互不干扰
2.非阻塞IO官方图解
这样做的好处:程序不会因IO操作进入阻塞态,虽然返回结果的数据依旧没有拿到,但可以一直占着CPU,切换进行其他的操作。
# 非阻塞IO模型 程序在系统调用时(跟操作系统内核要数据),无论是否获取到数据,都立刻返回一个结果 程序会根据结果(是否获取到数据),进行不同的操作(继续调用或向下执行),不会一直处于阻塞状态 # eg: 要自己实现一个非阻塞IO模型import socketimport timeserver = socket.socket()server.bind(('127.0.0.1', 8081))server.listen(5)# 将所有的网络阻塞变为非阻塞server.setblocking(False)r_list = []del_list = [] # 临时将需要无用的连接删除while True: try: conn, addr = server.accept() r_list.append(conn) # 这里并不是真的出错,而是阻塞变成非阻塞后,系统调用后,没有数据时的反馈(BWOULDBLOCK) except BlockingIOError: # time.sleep(0.1) # print('列表的长度:',len(r_list)) # print('做其他事') for conn in r_list: try: data = conn.recv(1024) # 没有消息 报错 if len(data) == 0: # 客户端断开链接 conn.close() # 关闭conn # 将无用的conn从r_list删除 del_list.append(conn) continue conn.send(data.upper()) except BlockingIOError: continue except ConnectionResetError: conn.close() del_list.append(conn) # 回收无用的链接 for conn in del_list: r_list.remove(conn) del_list.clear()# 客户端import socketclient = socket.socket()client.connect(('127.0.0.1',8081))while True: client.send(b'hello world') data = client.recv(1024) print(data)
总结
虽然非阻塞IO给你的感觉非常的牛逼但是该模型会长时间占用着CPU并且不干活 让CPU不停的空转我们实际应用中也不会考虑使用非阻塞IO模型任何的技术点都有它存在的意义 实际应用或者是思想借鉴
3.IO多路复用***官方图解
# IO多路复用模型 操作系统内部提供一个监管机制,能够帮程序监管socket和conn对象, 并且可以监管多个,只有系统数据获取到,就会返回对应的监管对象 当监管的对象只有一个的时候 其实IO多路复用连阻塞IO都比比不上!!! 但是IO多路复用可以一次性监管很多个对象# 存在IO阻塞的部分是 accept 和 recv ,分别是server对象和conn对象server = socket.socket()conn,addr = server.accept()# eg: 手动实现IO多路复用监管机制(内部实现其实跟非阻塞IO一样)是操作系统本身就有的 如果你想要用该监管机制(select) 需要你导入对应的select模块import socketimport selectserver = socket.socket()server.bind(('127.0.0.1',8080))server.listen(5)server.setblocking(False)read_list = [server]while True: r_list, w_list, x_list = select.select(read_list, [], []) # select返回的是一个元祖,元祖中的第一个列表包含 监管到的 多个对象。 """ 帮你监管,一旦有人来了 立刻给你返回对应的监管对象 """ # 此时,若有server连接对象,就会被select监管到 在返回的元祖第一个列表中 # res = select.select(read_list, [], []) # print(res) # ([socket.socket fd=3, family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, proto=0, laddr=('127.0.0.1', 8080)], [], []) # print(server) # 和select返回的结果,和server对象一样 # print(r_list) # 因为做了循环监管,此时就不仅仅只有server对象,还有conn对象。所以后续做了对象的判断。 for i in r_list: # """针对不同的对象做不同的处理""" if i is server: # server对象就连接操作 conn, addr = i.accept() # conn 也应该添加到监管的队列中 read_list.append(conn) else: # conn对象就行通信操作 res = i.recv(1024) if len(res) == 0: i.close() # 关闭conn连接 # 将无效的监管对象 移除 read_list.remove(i) continue print(res) i.send(b'heiheiheiheihei') # 客户端import socketclient = socket.socket()client.connect(('127.0.0.1',8080))while True: client.send(b'hello world') data = client.recv(1024) print(data)
总结
# 监管机制其实有很多1.select机制 windows linux都有2.poll机制 只在linux有 poll和select都可以监管多个对象 但是poll监管的数量更多上述select和poll机制其实都不是很完美 当监管的对象特别多的时候可能会出现 极其大的延时响应3. epoll机制 只在linux有 # redis 就是采用 IO多路复用模型 + epoll机制 它给每一个监管对象都绑定一个回调机制 一旦有响应 回调机制立刻发起提醒针对不同的操作系统还需要考虑不同检测机制 书写代码太多繁琐有一个人能够根据你跑的平台的不同自动帮你选择对应的监管机制selectors模块
4.异步IO官方图解
# 异步IO模型 程序在进行系统调用时(获取数据),是异步操作,cpu切换,进行其他操作 根据系统调用的回调机制,再执行 接受到数据的处理# 异步IO模型是所有模型中效率最高的 也是使用最广泛的相关的模块和框架 模块: asyncio模块 异步框架:sanic tronado twisted 速度快!!! import threadingimport asyncio # 游戏、交互式画面、爬虫 @asyncio.coroutinedef hello(): print('hello world %s'%threading.current_thread()) yield from asyncio.sleep(1) # 换成真正的IO操作 print('hello world %s' % threading.current_thread())loop = asyncio.get_event_loop()tasks = [hello(),hello()]loop.run_until_complete(asyncio.wait(tasks))loop.close()
四个IO模型对比官方图解
参考博客园图解,稍微了解即可
https://www.cnblogs.com/Dominic-Ji/articles/10929396.html
并发05--网络IO模型 相关文章
- Python3 并发编程之IO模型
目录: 一 IO模型介绍 二 阻塞IO(blocking IO) 三 非阻塞IO(non-blocking IO) 四 多路复用IO(IO multiplexing) 五 异步IO(Asynchronous I/O) 六 IO模型比较分析 七 selectors模块 视频链接 一 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步...
- 网络编程05_网络分层模型和TCP/IP协议族网络传输
网络编程05_网络分层模型和TCP/IP协议族网络传输 实习完回家后,准备来回顾一下网络基础的相关知识点。 网络传输 先举一个简单易懂的例子。 image 网络传输,我们可以比喻为2个人:甲 和 乙。然后他们之间需要传递一张...
- 卷积神经网络05(使用Pytorch构建模型)
卷积神经网络05(使用Pytorch构建模型) 步骤: 第一步 准备数据集 2 设计模型 3 使用自带的函数进行优化 4 训练的周期 minibatch 继承model 这里没有出现backward,是因为model中自带的有,假如自己所需要的没有,可以自己定义(使用...
- Tensorflow05-第一个神经元网络模型
使用tensorflow里的 fashion_mnist 服饰数据集 来完成此次的入门案例,建议使用 jupyter 分步执行,每步都理解掌握。 import tensorflow as tffrom tensorflow import kerasimport matplotlib.pyplot as plt# 加载数据集fashion_mnist = keras.datasets.fash
- 服务器高并发网络设计模型
服务器高并发网络设计模型 为什么80%的码农都做不了架构师? Nginx网络模型 一、进程模型 Nginx之所以为广大码农喜爱,除了其高性能外,还有其优雅的系统架构。与 Memcached 的经典多线程模型相比,Nginx是经典的多进程模型。Ngi...
- 常见网络服务器并发模型
常见网络服务器并发模型 文章目录 单线程循环 多线程/多进程 单线程IO复用 多线程/多进程IO复用 多线程划分IO角色 AIO 协程 近些年,随着互联网的大发展,高并发服务器技术也快速进步,从简单的循环服务器模型处理少量网络...
- 网络编程Linux网络IO模型
【网络编程】Linux网络IO模型 同步和异步,阻塞和非阻塞 同步和异步关注的是结果消息的通信机制 同步:同步的意思就是调用方需要主动等待结果的返回 异步:异步的意思就是不需要主动等待结果的返回,而是通过其他手段比如...
- Linux IO模型和网络编程模型
Linux IO模型和网络编程模型 目录 Linux IO模型 同步阻塞 同步非阻塞 IO复用 信号驱动 异步非阻塞 网络编程模型 BIO NIO 总结 术语概念描述: IO有内存IO、网络IO和磁盘IO三种,通常我们说的IO指的是后两者。 阻塞和非阻塞,是函数/...
- 网络IO模型
网络IO模型 同步IO与异步IO 阻塞IO socket默认是阻塞的 非阻塞IO IO多路复用 select:监控多个socket 后面找个例子敲敲select (基本被淘汰) 监听的socket个数有限;循环扫描监听,socket个数越多,性能越低。 信号驱动IO 异步IO
- 网络编程服务端的I/O模型事件处理模式并发模式
【网络编程】服务端的I/O模型,事件处理模式,并发模式 前言之前的前言 本文作于6月中旬,当时对于很多概念不是很理解,所以写到一半实在进行不下去,通过最近的学习终于理解了一些,赶紧总结记下。 前言 本篇主要总结...
- 网络 IO 模型
网络 IO 模型 大纲 阻塞 我们知道在调用某个函数的时候无非就是两种情况,要么 马上返回 ,然后根据返回值进行接下来的业务处理。当在使用 阻塞IO 的时候,应用程序会被无情的 挂起 ,等待内核完成操作,因为此时的内核可...
- 精通IO模型之路(二)--基于java的文件和网络IO
精通IO模型之路(二)--基于java的文件和网络IO 基于文件的java IO java IO模型受限于操作系统 java的IO模型受限于操作系统,java程序跑起来,对Linux系统而言也是一个普通的系统,让我觉得很有意思的是java有个JVM,有自己管理的堆空间...
- ?网络 IO 演变发展过程和模型介绍
作者:jaydenwen,腾讯 pcg 后台开发工程师 在互联网中提起网络,我们都会避免不了讨论高并发、百万连接。而此处的百万连接的实现,脱离不了网络 IO 的选择,因此本文作为一篇个人学习的笔记,特此进行记录一下整个网络 IO ...
- 【iOS】Moya网络层 + ObjectMapper数据转模型
【iOS】Moya网络层 + ObjectMapper数据转模型 Swift中的网络请求库Alamofire,相当于OC中的AFNetworking,在使用的过程中,我们一般都会对Alamofire做进一步的封装,可是结果有时不太理想。 所以就引出了Moya,它是一个网络抽象层,封装的...
- 同步异步阻塞非阻塞网络IO模型select/epoll
同步异步阻塞非阻塞网络IO模型select/epoll 总结记录一波 同步、异步、阻塞、非阻塞、异步I/O、select、poll、epoll等等,纯粹纯粹纯粹为了应付面试哈。 首先来解释同步和异步的概念,这两个概念与消息的 通知机制 有关。也就是...
- 五种网络通讯的IO模型
五种网络通讯的IO模型 五种网络通讯的IO模型 最近在看netty相关知识,很多文章都从IO模型切入讲解,这里先把IO的一些基础知识做个笔记。 五种IO模型分别是:阻塞IO、非阻塞IO、多路复用IO、信号驱动IO以及异步IO。 五种IO模型...
- Java的IO模型基于网络编程利弊分析
Java的IO模型基于网络编程利弊分析 JAVA的IO模型基于网络编程利弊分析 一、IO通俗理解 IO的过程 思考①答案:文件句柄 思考②答案: 阻塞/非阻塞 IO(程序对内核空间数据拷贝到用户空间阶段的耗时操作的等待方式) 同步/异步IO...
- 网络编程的5个IO模型
网络编程的5个IO模型 网络编程的5个io模型 据Unix网络编程,Unix主要有阻塞IO、非阻塞IO、信号驱动IO、IO复用、异步IO;前五种都是同步,只有最后一种才是异步IO。 1、 先贴上Unix网络编程的几张大图: 同步IO和异步IO的区别就在...
- Linux(UNIX)五种网络I/O模型与IO多路复用
Linux(UNIX)五种网络I/O模型与IO多路复用 Linux的内核将所有的外部设备都看做一个文件来操作,对一个文件的读写操作会调用内核提供的系统命令,返回一个file descriptor(fd 文件描述符)。而对一个socket的读写也会有相应的描述符,称...
- 从零开始学Netty (一)-- Linux网络IO模型 及 Java实现BIO、NIO
从零开始学Netty (一)-- Linux网络IO模型 及 Java实现BIO、NIO、AIO 下面准备做一个Netty的系列教程,适合初次接触Netty或网络通讯的同学了解阅读。本文主要介绍Linux网络IO模型、BIO、NIO、AIO及代码实现。至于更基础的OSI、TCP/IP、HTTP...