15 并发编程-(IO模型)
一、IO模型介绍
1、阻塞与非阻塞指的是程序的两种运行状态
阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立刻释放CPU资源
非阻塞(就绪态或运行态):没有遇到IO操作,或者通过某种手段让程序即便是遇到IO操作也不会停在原地,执行其他操作,力求尽可能多的占有CPU
2、同步与异步指的是提交任务的两种方式:
同步调用:提交完任务后,就在原地等待,直到任务运行完毕后,拿到任务的返回值,才继续执行下一行代码
异步调用:当进程执行到一个IO(等待外部数据)的时候,不需要等待,待数据接收成功后,再回来处理。
1.io模型 提交任务得方式:同步:提交完任务,等结果,执行下一个任务异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数 同步不等于阻塞:阻塞:遇到io,自己不处理,os会抢走cpu ,解决办法:监测到io,gevent切换到其他任务,类似欺骗os非阻塞:cpu 运行 IO分类:1.阻塞IO blocking IO2.非阻塞IO nonblocking IO3.IO多路复用 IO multiplexing4.信号驱动IO signal driven IO 用得比较少 5.异步IO asynchronous IO 遇到IO: 卡网络IO: 原地阻塞1.server端什么样得操作属于IO行为 # accept recv send 阻塞操作 accept recv 明显得等 send 不会明显等,但是一种io行为 2.为什么IO行为会让有在原地等待的效果 3.非阻塞io: 自己监测io 遇到io 就切 并且把 单线程得效率提到最高 导致得问题:1.当有数据来得时候,cpu 在做其他得事情,不会立即响应2.服务端没有任何阻塞,说白了,就是死循环,cpu会一直运转,线程处于就绪状态,大量占用cpu ,做无用,这个线程会一直问cpu,有数据没,有数据没 不推荐使用4.多路复用io:wait copy 还多了select 中间有个中介存在,帮问os 有没有数据但是如果中介 只有1个 效率不如 阻塞效率但是如果中介监测多个套接字 ,性能高就是:同时监测多个套接字问os系统好了没 就比阻塞io效率高监测套接字得io行为服务端得套接字有几类:server connselect 阻塞io 效率高比非阻塞io 效率也高 ,一直做无用总结:同时监测多个套接字列表 循环 慢 假设列表数据多,循环 效率低 监测套接字好没好 从头到尾 循环1遍select 列表循环 效率低poll 可接收得列表数据多 效率也不高epoll 效率最高得 异步操作 每个套接字身上绑定个回调函数,谁好了谁触发回调,(就不用去遍历了 效率低)epoll windows 不支持linux 支持selectors 模块 自动根据操作系统选择pollepoll
二、阻塞IO模型
默认情况下,所有的socket都是blocking模型,
实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。
这给网络编程带来了一个很大的问题,如在调用recv(1024)的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。
blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。
三、非阻塞IO模型
在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。
![](/assets/blank.gif)
![](/assets/blank.gif)
from socket import *server = socket(AF_INET, SOCK_STREAM) server.bind(('127.0.0.1',8083)) server.listen(5) server.setblocking(False) print('starting...')rlist=[] wlist=[] while True:try:conn, addr = server.accept()rlist.append(conn)print(rlist)except BlockingIOError:# print('干其他的活')#收消息del_rlist = []for conn in rlist:try:data=conn.recv(1024)if not data:del_rlist.append(conn)continuewlist.append((conn,data.upper()))except BlockingIOError:continueexcept Exception:conn.close()del_rlist.append(conn)#发消息del_wlist=[]for item in wlist:try:conn=item[0]data=item[1]conn.send(data)del_wlist.append(item)except BlockingIOError:passfor item in del_wlist:wlist.remove(item)for conn in del_rlist:rlist.remove(conn)server.close()
View Code
四、多路复用IO模型
五、异步IO模型
六、各种IO模型对比
七、了解selectors模块的使用
转载于:https://www.cnblogs.com/foremostxl/p/9738068.html
15 并发编程-(IO模型)相关推荐
- 学习笔记(36):Python网络编程并发编程-IO模型介绍
立即学习:https://edu.csdn.net/course/play/24458/296460?utm_source=blogtoedu I/O模型介绍:I/O模型表示处于等待状态的模型,如套接 ...
- Java网络编程------IO模型的同步/异步/阻塞/非阻塞(1)
IO模型的同步/异步/阻塞/非阻塞 一.同步/异步/阻塞/非阻塞 1.同步和异步 2.阻塞和非阻塞 3.同步.异步和阻塞.非阻塞组合 二.IO 1.I/O 2.阻塞IO和非阻塞IO 3.同步IO和同步 ...
- 并发编程---JMM模型
引言 在了解本文之前,我们知道所谓的并发编程就是平日中接触的多线程编程,既然扯到了多线程,那一定绕不开多线程的一些特性以及每个线程的结构或者说是线程的内存模型.接下来,我们从JMM(Java线程内存模 ...
- JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....
关于Java面试,面试官一般喜欢问哪些问题? 本文对一些高频问题做了汇总,为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于 JAVA 接下来,我们逐条来看看每个问题及答案 JDK. ...
- JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...
JDK.JRE.JVM 三者有什么关系? 答案: JDK(全称 Java Development Kit),Java开发工具包,能独立创建.编译.运行程序. JDK = JRE + java开发工具( ...
- java并发编程--内存模型
1.内存模型 1.1.高速缓存 程序运行过程中,将运算需要的数据从主存复制一份到CPU的高速缓存当中,那么CPU进行运算就可以直接从高速缓存中读取数据和写入数据,当运算结束之后将高速缓存中的数据刷新到 ...
- Linux网络编程 | IO模型 :阻塞IO、非阻塞IO、信号驱动IO、异步IO、多路复用IO
目录 IO模型 阻塞与非阻塞 同步与异步 阻塞IO 非阻塞IO 信号驱动IO 多路复用IO 异步IO IO模型 根据各自的特性不同,IO模型被分为阻塞IO.非阻塞IO.信号驱动IO.异步IO.多路复用 ...
- Java并发编程 - 共享模型之管程
一. 共享带来的问题 小故事 老王(操作系统)有一个功能强大的算盘(CPU),现在想把它租出去,赚一点外快 小南.小女(线程)来使用这个算盘来进行一些计算,并按照时间给老王支付费用 但小南不能一天 2 ...
- JUC并发编程共享模型之无锁(五)
5.1 问题引出 public interface Account {// 获取余额Integer getBalance();void withdraw(Integer amount);/*** 方法 ...
最新文章
- php request payload怎么接收,[问题] PHP接收Request payload传递过来的参数
- 3. 什么是icmp?icmp与ip的关系_「2020.12.3」黄俊捷热搜被爆料?郭俊辰交往女朋友?为什么三只跨年不合体?郝富申和王俊凯关系?Naomi和alracco?...
- 数学分析 连续函数的孤立零点
- 一次历史漏洞分析与复现的全部过程
- 【Matlab】parfor并行运算如何显示进度条?
- cookie的设置和获取
- Centos中查找文件、目录、内容
- EasyUI+JSP之java读取数据库后JSON格式数据的返回及调用
- 吴恩达深度学习之三《结构化机器学习项目》学习笔记
- Zookeeeper开源客户端curator watcherAPI的使用
- C语言物流管理运输系统
- linux 交叉编译 makefile,简单谈谈Makefile和交叉编译工具链
- JS-记事本(代码)
- Windows Edge浏览器右键菜单透明、难以分辨问题的解决办法
- regopenkeyexfailed什么意思_外置网卡驱动安装出现RegOpenKeyEx Failed,怎么回事?
- Vue+Element实现tab页多页面切换
- HTML5对网络营销的影响,什么是互联网营销思维,简述互联网思维对网络营销的影响...
- 第十四章 字符编码(补充)
- Dubbo的Api+Provider+Customer示例(IDEA+Maven+Springboot+dubbo) 项目结构
- Debian apache
热门文章
- k8s源码分析 pdf_rook源码分析之一:rook架构解析
- php pdo使用事务,PHP内PDO事务使用步骤详解
- linux进程socket通信,linux进程间通信--socket套接字 实例代码
- android蓝牙pair,Android向更多蓝牙设备开放Fast Pair功能 配对更轻松了
- oracle+trace参数设置,Oracle autotrace参数详解
- epoll nio区别_【总结】两种 NIO 实现:Selector 与 Epoll
- linux方法参数,Linux的sysctl 命令 参数
- java中datetime类型转换,Java中日期格式和其他类型转换详解
- MongoDB查询性能分析—— explain 操作返回结果详解
- VS2019 WPF制作OTA上位机(一)新建工程