day42 io模型
一、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模型的更多相关文章
- 高性能IO模型浅析
高性能IO模型浅析 服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking ...
- 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型
1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...
- Linux下常见的IO模型
前言 阻塞IO(blocking IO) 非阻塞IO(nonblocking IO) IO复用(IO multiplexing) 异步IO(asynchronous IO (the POSIX aio ...
- IO模型
前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...
- Linux下5种IO模型的小结
概述 接触网络编程,我们时常会与各种与IO相关的概念打交道:同步(Synchronous).异步(ASynchronous).阻塞(blocking)和非阻塞(non-blocking).关于概念的区 ...
- 操作系统IO模型
操作系统IO模型 声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用. 本节内容 UNIX下可用的五种I/O模型 三种I/O模型 Rea ...
- 同步异步,阻塞非阻塞 和nginx的IO模型
同步与异步 同步和异步关注的是消息通信机制 (synchronous communication/ asynchronous communication).所谓同步,就是在发出一个*调用*时,在没有得 ...
- 几种服务器端IO模型的简单介绍及实现
一些概念: 同步和异步 同步和异步是针对应用程序和内核的交互而言的,同步指的是用户进程触发I/O操作并等待或者轮询的去查看I/O操作是否就绪,而异步是指用户进程触发I/O操作以后便开始做自己的事情,而 ...
- Linux 网络编程(IO模型)
针对linux 操作系统的5类IO模型,阻塞式.非阻塞式.多路复用.信号驱动和异步IO进行整理,参考<linux网络编程>及相关网络资料. 阻塞模式 在socket编程(如下图)中调用如下 ...
随机推荐
- 变分(图)自编码器不能直接应用于下游任务(GAE, VGAE, AE, VAE and SAE)
自编码器是无监督学习领域中一个非常重要的工具.最近由于图神经网络的兴起,图自编码器得到了广泛的关注.笔者最近在做相关的工作,对科研工作中经常遇到的:自编码器(AE),变分自编码器(VAE),图 ...
- 4.vue class 绑定- model基础应用
//代码可以复制自行体验 <template> <div id="app" @click.stop="test('你点击了我big- ...
- Python--文件操作(操作文件)
文件的操作包含:读.写.修改 文件的多种操作: # 读取文件的所有内容 data = open("yesteday.txt", encoding="utf-8" ...
- Logstash下字段以及嵌套Json字段类型转换
前言 从filebeat传输到Logstash的数据,某个字段需要由string类型装换成float类型.但是不管怎么改logstash的配置文件都不生效,其实官方文档都有,但是具体细节方面的东西就得 ...
- Linux 安装 MySql5.7
首先在官网下载对应版本的Linux安装包.一般来说应用 community 版本就可以. mysql community version download addr 1. 将文件上传至 Linux 并 ...
- (一)DB、DBMS、SQL之间的关系
一.概念 DB:数据库(database)相当于一个仓库,用于有组织的采存储数据. DBMS:数据库管理系统(database manage system)数据库是通过DBMS来创建和操作,种类很多( ...
- Golang简单入门教程——函数进阶篇
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是golang专题的第八篇,我们来聊聊golang当中的函数. 我们在之前的时候已经介绍过了函数的基本用法,知道了怎么样设计或者是定义一 ...
- Mysql 视图用途、使用场景、性能问题及使用注意事项
原文:https://blog.csdn.net/chuangxin/article/details/84574557 <SQLite权威指南>中作者是这么定义视图的:视图即是虚拟表,也称 ...
- Shiro反序列化复现
Shiro反序列化复现 ——————环境准备—————— 目标靶机:10.11.10.108 //docker环境 攻击机ip:无所谓 vpsip:192.168.14.222 //和靶机ip可通 1 ...
- java中Proxy类初探
在java中提供了一个动态代理类,这个类位于java.lang.reflect包中的Proxy类中.什么是动态代理类呢?就是可以在运行时创建一个实现了一组给定接口的新类.听上去有点高深的样子,其实是提 ...