非阻塞io

  1. from socket import *
  2. import time
  3. s=socket(AF_INET,SOCK_STREAM)
  4. s.bind(('127.0.0.1',8080))
  5. s.listen(5)
  6. s.setblocking(False) #设置socket的接口为非阻塞
  7. conn_l=[]
  8. del_l=[]
  9. while True:
  10. try:
  11. conn,addr=s.accept()
  12. conn_l.append(conn)
  13. except BlockingIOError:
  14. print(conn_l)
  15. for conn in conn_l:
  16. try:
  17. data=conn.recv(1024)
  18. if not data:
  19. del_l.append(conn)
  20. continue
  21. conn.send(data.upper())
  22. except BlockingIOError:
  23. pass
  24. except ConnectionResetError:
  25. del_l.append(conn)
  26.  
  27. for conn in del_l:
  28. conn_l.remove(conn)
  29. conn.close()
  30. del_l=[]

特点:实现了非阻塞,提高了cpu占用率,但由于一直监听 accept ,cpu占用率过高!

多路复用

select 模型:

  1. from socket import *
  2. import select
  3.  
  4. s=socket(AF_INET,SOCK_STREAM)
  5. s.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
  6. s.bind(('127.0.0.1',8081))
  7. s.listen(5)
  8. s.setblocking(False) #设置socket的接口为非阻塞
  9. read_l=[s,]
  10. while True:
  11. r_l,w_l,x_l=select.select(read_l,[],[])
  12. print(r_l)
  13. for ready_obj in r_l:
  14. if ready_obj == s:
  15. conn,addr=ready_obj.accept() #此时的ready_obj等于s
  16. read_l.append(conn)
  17. else:
  18. try:
  19. data=ready_obj.recv(1024) #此时的ready_obj等于conn
  20. if not data:
  21. ready_obj.close()
  22. read_l.remove(ready_obj)
  23. continue
  24. ready_obj.send(data.upper())
  25. except ConnectionResetError:
  26. ready_obj.close()
  27. read_l.remove(ready_obj)

select 模型过程:

用户进程创建socket对象,拷贝监听的fd到内核空间,每一个fd会对应一张系统文件表,内核空间的fd响应到数据后,就会发送信号给用户进程数据已到;

#用户进程再发送系统调用,比如(accept)将内核空间的数据copy到用户空间,同时作为接受数据端内核空间的数据清除,这样重新监听时fd再有新的数据又可以响应到了(发送端因为基于TCP协议所以需要收到应答后才会清除)。

缺点:因为当需要探测的句柄值较大时,select()接口本身需要消耗大量时间去轮询各个句柄。

epoll 更好的选择,但是windows不支持。

selector模型——根据系统自动选择

  1. from socket import *
  2. import selectors
  3.  
  4. sel=selectors.DefaultSelector()
  5. def accept(server_fileobj,mask):
  6. conn,addr=server_fileobj.accept()
  7. sel.register(conn,selectors.EVENT_READ,read)
  8.  
  9. def read(conn,mask):
  10. try:
  11. data=conn.recv(1024)
  12. if not data:
  13. print('closing',conn)
  14. sel.unregister(conn)
  15. conn.close()
  16. return
  17. conn.send(data.upper()+b'_SB')
  18. except Exception:
  19. print('closing', conn)
  20. sel.unregister(conn)
  21. conn.close()
  22.  
  23. server_fileobj=socket(AF_INET,SOCK_STREAM)
  24. server_fileobj.setsockopt(SOL_SOCKET,SO_REUSEADDR,1)
  25. server_fileobj.bind(('127.0.0.1',8088))
  26. server_fileobj.listen(5)
  27. server_fileobj.setblocking(False) #设置socket的接口为非阻塞
  28. sel.register(server_fileobj,selectors.EVENT_READ,accept) #相当于网select的读列表里append了一个文件句柄server_fileobj,并且绑定了一个回调函数accept
  29.  
  30. while True:
  31. events=sel.select() #检测所有的fileobj,是否有完成wait data的
  32. for sel_obj,mask in events:
  33. callback=sel_obj.data #callback=accpet
  34. callback(sel_obj.fileobj,mask) #accpet(server_fileobj,1)
  1. from socket import *
  2. import time
  3. s=socket(AF_INET,SOCK_STREAM)
  4. s.bind(('127.0.0.1',8080))
  5. s.listen(5)
  6. s.setblocking(False) #设置socket的接口为非阻塞
  7. conn_l=[]
  8. del_l=[]
  9. while True:
  10. try:
  11. conn,addr=s.accept()
  12. conn_l.append(conn)
  13. except BlockingIOError:
  14. print(conn_l)
  15. for conn in conn_l:
  16. try:
  17. data=conn.recv(1024)
  18. if not data:
  19. del_l.append(conn)
  20. continue
  21. conn.send(data.upper())
  22. except BlockingIOError:
  23. pass
  24. except ConnectionResetError:
  25. del_l.append(conn)
  26.  
  27. for conn in del_l:
  28. conn_l.remove(conn)
  29. conn.close()
  30. del_l=[]

io类型的更多相关文章

  1. 关于不同应用程序存储IO类型的描述

    介绍 存储系统作为数据的载体,为前端的服务器和应用程序提供读写服务.存储阵列某种意义上来说,是对应用服务器提供数据服务的后端“服务器”.应用服务器对存 储系统发送数据的“读”和“写”的请求.然而,不同 ...

  2. 数据一致性和io类型

    版权声明:本文由高剑林原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/106 来源:腾云阁 https://www.qclo ...

  3. java中io类型及成熟io框架

    就io本身而言,概念上有5中模型:blocking I/O, nonblocking I/O, I/O multiplexing(select and poll), singal driven I/O ...

  4. [翻译]各个类型的IO - 阻塞, 非阻塞,多路复用和异步

    同事推荐,感觉写的不错就试着翻译了下. 原文链接: https://www.rubberducking.com/2018/05/the-various-kinds-of-io-blocking-non ...

  5. FPGA之IO信号类型深入理解

    在FPGA设计开发中,很多场合会遇到同一根信号既可以是输入信号,又可以是输出信号,即IO类型(Verilog定义成inout). 对于inout型的信号,我们既可以使用FPGA原语来实现,也可以使用V ...

  6. [连载]《C#通讯(串口和网络)框架的设计与实现》- 5.串口和网络统一IO设计

    目       录 第五章           串口和网络统一IO设计... 2 5.1           统一IO接口... 2 5.1.1    串口IO.. 4 5.1.2    网络IO.. ...

  7. 操作系统IO模型

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

  8. Scalaz(41)- Free :IO Monad-Free特定版本的FP语法

    我们不断地重申FP强调代码无副作用,这样才能实现编程纯代码.像通过键盘显示器进行交流.读写文件.数据库等这些IO操作都会产生副作用.那么我们是不是为了实现纯代码而放弃IO操作呢?没有IO的程序就是一段 ...

  9. 泛函编程(37)-泛函Stream IO:通用的IO处理过程-Free Process

    在上两篇讨论中我们介绍了IO Process:Process[I,O],它的工作原理.函数组合等.很容易想象,一个完整的IO程序是由 数据源+处理过程+数据终点: Source->Process ...

随机推荐

  1. Vue 插件和Preset

    插件和Preset 插件 Vue CLI 使用了一套基于插件的架构 Vue CLI 使用了一套基于插件的架构.如果你查阅一个新创建项目的 package.json,就会发现依赖都是以 @vue/cli ...

  2. Apache Commons configuration使用入门

    使用Commons  Configuration可以很好的管理我们的配置文件的读写, 官网:http://commons.apache.org/configuration 需要用到commons-la ...

  3. 【转】我为什么把think in java 读了10遍

    我在想写这篇博文之前,就曾经对我媳妇(她是做web前端的)讲,我把think in java看了几次几次,媳妇那时就用很羡慕和莫名的眼神看着我说,你真有毅力,我当时就蒙了,我以为她会说,你现在基础一定 ...

  4. if语句中的 == 和= 区别

    ”==“ 是判断二者的值是否相等   ”=“是赋值,是将后者的值赋值给前者,不需要比较,在if语句中用”==“来判断ul当前的状态,来判断执行的操作,若是用”=“,则相等于说ul的状态就是后者,直接执 ...

  5. iOS一段文字设置多种颜色格式

    调用 [self fuwenbenLabel:contentLabel FontNumber:[UIFont systemFontOfSize:] AndRange:NSMakeRange(, ) A ...

  6. [转]slf4j 与log4j 日志管理

    log4j简易入门 package test.log4j; import org.apache.log4j.Logger; public class HelloLog4j { private stat ...

  7. django添加装饰器

    引入模块: from django.utils.decorators import method_decorator 添加:@method_decorator(func) from django.ut ...

  8. synchronized Lock

    synchronized和Lock都是Java语言提供的两种实现对共享资源进行同步的机制.其中synchronized使用Object对象本身的wait().notify().notifyAll()方 ...

  9. Python之路(第十八篇)shutil 模块、zipfile模块、configparser模块

    一.shutil 模块 1.shutil.copyfileobj(fsrc, fdst[, length]) 将文件内容拷贝到另一个文件中,需要打开文件 import shutil shutil.co ...

  10. angular2在双向数据绑定时[(ngModel)]无法使用的问题

    angular2在双向数据绑定时[(ngModel)]无法使用,出现的错误是: Can't bind to 'ngModel' since it isn't a known property of ' ...