一、io模型简介

Stevens在文章中一共比较了五种IO Model:

  • blocking IO 阻塞IO

  • nonblocking IO 非阻塞IO

  • IO multiplexing IO多路复用
  • signal driven IO 信号驱动IO
  • asynchronous IO 异步IO

    由signal driven IO(信号驱动IO)在实际中并不常用,所以主要介绍其余四种IO Model。

常见的网络阻塞状态:accept,recv

二、阻塞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()

三、非阻塞io

服务端

import socket

sever = socket.socket()
sever.bind(('127.0.0.1',8080))
sever.listen(5)
sever.setblocking(False)
# 把服务端中的io延迟都改成非阻塞态,直接运行后面的代码
# 原来的io是为了防止报错,让我们停住,现在改成非阻塞了,就要在每一个io前抓取错误
r_list = []
del_list = []
while True:
try:
conn,addr = sever.accept()
r_list.append(conn)
except BlockingIOError:
for conn in r_list:
try:
data = conn.recv(1024)
if len(data) == 0:
del_list.append(conn)
conn.close()
continue
conn.send(data.upper())
except BlockingIOError:
continue
except ConnectionResetError:
del_list.append(conn)
conn.close()
for conn in del_list:
r_list.remove(conn)
del_list.clear() 客户端
import socket s = socket.socket()
s.connect(('127.0.0.1',8080)) while True:
s.send('hz is nb'.encode('utf-8'))
data = s.recv(1024)
print(data)

四、io多路复用

io多路复用本质上是操作系统帮我们监测任务的返回值,我们同样要把程序中的阻塞态改成非阻塞态。

在监管对象只有一个的时候,他的效率还没有阻塞io快,用于多个对象运行。

服务端

import socket
import select s = socket.socket()
s.bind(('127.0.0.1',8082))
s.listen(5)
s.setblocking(False)
r_list = [s] while True:
r, w, x = select.select(r_list, [], [])
# 通过select帮我们监测对象的执行
for i in r:
# 不同的对象执行不同的代码
if i is s:
conn,addr = i.accept()
r_list.append(conn)
else:
try:
data = i.recv(1024)
if len(data) == 0:
i.close()
r_list.remove(i)
continue
i.send(data.upper())
except ConnectionResetError:
i.close()
r_list.remove(i)
客户端
import socket c = socket.socket()
c.connect(('127.0.0.1',8082))
while True:
c.send(b'hz is nb')
data = c.recv(1024)
print(data)

五、异步io

"""
异步IO模型是所有模型中效率最高的 也是使用最广泛的
相关的模块和框架
模块:asyncio模块
异步框架:sanic tronado twisted
速度快!!!
"""
import threading
import asyncio @asyncio.coroutine
def 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()

day42 io模型的更多相关文章

  1. 高性能IO模型浅析

    高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking  ...

  2. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

  3. Linux下常见的IO模型

    前言 阻塞IO(blocking IO) 非阻塞IO(nonblocking IO) IO复用(IO multiplexing) 异步IO(asynchronous IO (the POSIX aio ...

  4. IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  5. Linux下5种IO模型的小结

    概述 接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous).异步(ASynchronous).阻塞(blocking)和非阻塞(non-blocking).关于概念的区 ...

  6. 操作系统IO模型

    操作系统IO模型 声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用. 本节内容 UNIX下可用的五种I/O模型 三种I/O模型 Rea ...

  7. 同步异步,阻塞非阻塞 和nginx的IO模型

    同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...

  8. 几种服务器端IO模型的简单介绍及实现

    一些概念: 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,而异步是指用户进程触发I/O操作以后便开始做自己的事情,而 ...

  9. Linux 网络编程(IO模型)

    针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...

随机推荐

  1. 8000字长文让你彻底了解 Java 8 的 Lambda、函数式接口、Stream 用法和原理

    我是风筝,公众号「古时的风筝」.一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  2. .Net Core实战之基于角色的访问控制的设计

    前言 上个月,我写了两篇微服务的文章:<.Net微服务实战之技术架构分层篇>与<.Net微服务实战之技术选型篇>,微服务系列原有三篇,当我憋第三篇的内容时候一直没有灵感,因此先 ...

  3. C#9.0 终于来了,您还学的动吗? 带上VS一起解读吧!(应该是全网第一篇)

    一:背景 1. 讲故事 好消息,.NET 5.0 终于在2020年6月10日发布了第五个预览版,眼尖的同学一定看到了在这个版本中终于支持了 C# 9.0,此处有掌声,太好了!!! .Net5官方链接 ...

  4. PE文件介绍 (1)

    PE文件介绍 PE文件主要是windows操作系统下使用的可执行文件格式,PE文件是指32位的可执行文件也叫做PE32,64位可执行文件叫做PE+或者PE32+ PE文件格式 种类 主扩展名 可执行类 ...

  5. tomcat的安装部署(windows10)

    一.Tomact下载 地址:https://tomcat.apache.org/

  6. TCP和UDP的Socket编程实验

    Linux Socket 函数库是从 Berkeley 大学开发的 BSD UNIX 系统中移植过来的.BSD Socket 接口是在众多 Unix 系统中被广泛支持的 TCP/IP 通信接口,Lin ...

  7. nslookup使用及常用命令

    nslookup是命令行里一个常用的DNS查询工具,最常用的功能是域名解析和反向解析. 下面罗列一些常用的nslookup命令 nslookup # 进入交互模式 >域名 # 进行正向解析 &g ...

  8. 小白的mapbox学习之路-显示地图

    刚接触mapbox,只是简单记下自己的学习之路,如有错误,欢迎大神指正 1-头部引入链接 2-body中定义一个div块,用来显示地图 3-在script中创建一个map对象,并设置相关参数 mapb ...

  9. springboot 2.X 集成redis

    在实际开发中,经常会引入redis中间件做缓存,这里介绍springboot2.X后如何配置redis 1 Maven中引入redis springboot官方通过spring-boot-autoco ...

  10. git 如何解决 (master|MERGING)

    git 如何解决 (master|MERGING) git reset --hard head //回退版本信息 git pull origin master