io类型
非阻塞io
- from socket import *
- import time
- s=socket(AF_INET,SOCK_STREAM)
- s.bind(('127.0.0.1',8080))
- s.listen(5)
- s.setblocking(False) #设置socket的接口为非阻塞
- conn_l=[]
- del_l=[]
- while True:
- try:
- conn,addr=s.accept()
- conn_l.append(conn)
- except BlockingIOError:
- print(conn_l)
- for conn in conn_l:
- try:
- data=conn.recv(1024)
- if not data:
- del_l.append(conn)
- continue
- conn.send(data.upper())
- except BlockingIOError:
- pass
- except ConnectionResetError:
- del_l.append(conn)
- for conn in del_l:
- conn_l.remove(conn)
- conn.close()
- del_l=[]
特点:实现了非阻塞,提高了cpu占用率,但由于一直监听 accept ,cpu占用率过高!
多路复用
select 模型:
- from socket import *
- import select
- s=socket(AF_INET,SOCK_STREAM)
- s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
- s.bind(('127.0.0.1',8081))
- s.listen(5)
- s.setblocking(False) #设置socket的接口为非阻塞
- read_l=[s,]
- while True:
- r_l,w_l,x_l=select.select(read_l,[],[])
- print(r_l)
- for ready_obj in r_l:
- if ready_obj == s:
- conn,addr=ready_obj.accept() #此时的ready_obj等于s
- read_l.append(conn)
- else:
- try:
- data=ready_obj.recv(1024) #此时的ready_obj等于conn
- if not data:
- ready_obj.close()
- read_l.remove(ready_obj)
- continue
- ready_obj.send(data.upper())
- except ConnectionResetError:
- ready_obj.close()
- read_l.remove(ready_obj)
select 模型过程:
用户进程创建socket对象,拷贝监听的fd到内核空间,每一个fd会对应一张系统文件表,内核空间的fd响应到数据后,就会发送信号给用户进程数据已到;
#用户进程再发送系统调用,比如(accept)将内核空间的数据copy到用户空间,同时作为接受数据端内核空间的数据清除,这样重新监听时fd再有新的数据又可以响应到了(发送端因为基于TCP协议所以需要收到应答后才会清除)。
缺点:因为当需要探测的句柄值较大时,select()接口本身需要消耗大量时间去轮询各个句柄。
epoll 更好的选择,但是windows不支持。
selector模型——根据系统自动选择
- from socket import *
- import selectors
- sel=selectors.DefaultSelector()
- def accept(server_fileobj,mask):
- conn,addr=server_fileobj.accept()
- sel.register(conn,selectors.EVENT_READ,read)
- def read(conn,mask):
- try:
- data=conn.recv(1024)
- if not data:
- print('closing',conn)
- sel.unregister(conn)
- conn.close()
- return
- conn.send(data.upper()+b'_SB')
- except Exception:
- print('closing', conn)
- sel.unregister(conn)
- conn.close()
- server_fileobj=socket(AF_INET,SOCK_STREAM)
- server_fileobj.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
- server_fileobj.bind(('127.0.0.1',8088))
- server_fileobj.listen(5)
- server_fileobj.setblocking(False) #设置socket的接口为非阻塞
- sel.register(server_fileobj,selectors.EVENT_READ,accept) #相当于网select的读列表里append了一个文件句柄server_fileobj,并且绑定了一个回调函数accept
- while True:
- events=sel.select() #检测所有的fileobj,是否有完成wait data的
- for sel_obj,mask in events:
- callback=sel_obj.data #callback=accpet
- callback(sel_obj.fileobj,mask) #accpet(server_fileobj,1)
- from socket import *
- import time
- s=socket(AF_INET,SOCK_STREAM)
- s.bind(('127.0.0.1',8080))
- s.listen(5)
- s.setblocking(False) #设置socket的接口为非阻塞
- conn_l=[]
- del_l=[]
- while True:
- try:
- conn,addr=s.accept()
- conn_l.append(conn)
- except BlockingIOError:
- print(conn_l)
- for conn in conn_l:
- try:
- data=conn.recv(1024)
- if not data:
- del_l.append(conn)
- continue
- conn.send(data.upper())
- except BlockingIOError:
- pass
- except ConnectionResetError:
- del_l.append(conn)
- for conn in del_l:
- conn_l.remove(conn)
- conn.close()
- del_l=[]
io类型的更多相关文章
- 关于不同应用程序存储IO类型的描述
介绍 存储系统作为数据的载体,为前端的服务器和应用程序提供读写服务.存储阵列某种意义上来说,是对应用服务器提供数据服务的后端“服务器”.应用服务器对存 储系统发送数据的“读”和“写”的请求.然而,不同 ...
- 数据一致性和io类型
版权声明:本文由高剑林原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/106 来源:腾云阁 https://www.qclo ...
- java中io类型及成熟io框架
就io本身而言,概念上有5中模型:blocking I/O, nonblocking I/O, I/O multiplexing(select and poll), singal driven I/O ...
- [翻译]各个类型的IO - 阻塞, 非阻塞,多路复用和异步
同事推荐,感觉写的不错就试着翻译了下. 原文链接: https://www.rubberducking.com/2018/05/the-various-kinds-of-io-blocking-non ...
- FPGA之IO信号类型深入理解
在FPGA设计开发中,很多场合会遇到同一根信号既可以是输入信号,又可以是输出信号,即IO类型(Verilog定义成inout). 对于inout型的信号,我们既可以使用FPGA原语来实现,也可以使用V ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》- 5.串口和网络统一IO设计
目 录 第五章 串口和网络统一IO设计... 2 5.1 统一IO接口... 2 5.1.1 串口IO.. 4 5.1.2 网络IO.. ...
- 操作系统IO模型
操作系统IO模型 声明:如下内容是根据APUE和mycat两本著作中关于I/O模式的一些内容加上自己的一些理解整理而成,仅供学习使用. 本节内容 UNIX下可用的五种I/O模型 三种I/O模型 Rea ...
- Scalaz(41)- Free :IO Monad-Free特定版本的FP语法
我们不断地重申FP强调代码无副作用,这样才能实现编程纯代码.像通过键盘显示器进行交流.读写文件.数据库等这些IO操作都会产生副作用.那么我们是不是为了实现纯代码而放弃IO操作呢?没有IO的程序就是一段 ...
- 泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process
在上两篇讨论中我们介绍了IO Process:Process[I,O],它的工作原理.函数组合等.很容易想象,一个完整的IO程序是由 数据源+处理过程+数据终点: Source->Process ...
随机推荐
- Vue 插件和Preset
插件和Preset 插件 Vue CLI 使用了一套基于插件的架构 Vue CLI 使用了一套基于插件的架构.如果你查阅一个新创建项目的 package.json,就会发现依赖都是以 @vue/cli ...
- Apache Commons configuration使用入门
使用Commons Configuration可以很好的管理我们的配置文件的读写, 官网:http://commons.apache.org/configuration 需要用到commons-la ...
- 【转】我为什么把think in java 读了10遍
我在想写这篇博文之前,就曾经对我媳妇(她是做web前端的)讲,我把think in java看了几次几次,媳妇那时就用很羡慕和莫名的眼神看着我说,你真有毅力,我当时就蒙了,我以为她会说,你现在基础一定 ...
- if语句中的 == 和= 区别
”==“ 是判断二者的值是否相等 ”=“是赋值,是将后者的值赋值给前者,不需要比较,在if语句中用”==“来判断ul当前的状态,来判断执行的操作,若是用”=“,则相等于说ul的状态就是后者,直接执 ...
- iOS一段文字设置多种颜色格式
调用 [self fuwenbenLabel:contentLabel FontNumber:[UIFont systemFontOfSize:] AndRange:NSMakeRange(, ) A ...
- [转]slf4j 与log4j 日志管理
log4j简易入门 package test.log4j; import org.apache.log4j.Logger; public class HelloLog4j { private stat ...
- django添加装饰器
引入模块: from django.utils.decorators import method_decorator 添加:@method_decorator(func) from django.ut ...
- synchronized Lock
synchronized和Lock都是Java语言提供的两种实现对共享资源进行同步的机制.其中synchronized使用Object对象本身的wait().notify().notifyAll()方 ...
- Python之路(第十八篇)shutil 模块、zipfile模块、configparser模块
一.shutil 模块 1.shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中,需要打开文件 import shutil shutil.co ...
- angular2在双向数据绑定时[(ngModel)]无法使用的问题
angular2在双向数据绑定时[(ngModel)]无法使用,出现的错误是: Can't bind to 'ngModel' since it isn't a known property of ' ...