Python之阻塞IO模型与非阻塞IO模型

  IO模型

    1 阻塞IO:

      全程阻塞

    2 非阻塞IO:

        发送多次系统调用:

          优点:wait for data时无阻塞

          缺点:1 系统调用太多 2 数据不是实时接受的

        两个阶段:wait for data:非阻塞

             copy data :阻塞

    3 IO多路复用(监听多个连接)

        sock::sock <socket.socket fd=224,
        family=AddressFamily.AF_INET,
        type=SocketKind.SOCK_STREAM,
        proto=0, laddr=('127.0.0.1', 8800)>

    对于文件描述符(套接字对象):

      1 是一个非零整数,不会变

      2 收发数据的时候,对于接收端而言,数据先到内核空间,
        然后copy到用户空间,同时,内核空间数据清除。

    特点:

      1 全程(wait for data,copy)阻塞
      2 能监听多个文件描述符

      实现并发

    IO多路复用的实现机制:

      win:Select

      Linux:Select and Poll or Epoll  (有epoll用epoll,没有则Select)

    Select的缺点:

      1、每次调用Select 都要将所有的fd(文件描述符)拷贝到内核空间。从而导致效率下降。

      2、遍历所有的fd,是否有数据访问。浪费时间(最重要的问题)

      3、最大连接数(1024)

    poll:

      1、最大连接数没有限制。这是和Select最大的区别。

    epoll:

      内部通过三个函数实现的。

      1、第一个函数:创建一个epoll句柄。方便将fd以一次性的拷到内核去。but,只需要拷贝一次。

      2、第二个函数:回调函数,在某一个函数或动作完成后会触发的函数。为所有的fd绑定一个回调函数。

                一旦有数据访问,就会触发该回调函数,回调函数将fd放到列表中。

      3、第三个函数:判断列表是否为空。

      没有最大链接数。

    4 异步IO

      全程无阻塞

    5 驱动信号

  总结:

    同步: 阻塞IO 非阻塞IO io多路复用
    异步: 异步IO

Selectors模块:

 import selectors  # 基于select模块实现的IO多路复用,建议大家使用

 import socket

 sock=socket.socket()
sock.bind(("127.0.0.1",8800)) sock.listen(5) sock.setblocking(False) sel=selectors.DefaultSelector() #根据具体平台选择最佳IO多路机制,比如在linux,选择epoll def read(conn,mask): try:
data=conn.recv(1024)
print(data.decode("UTF8"))
data2=input(">>>")
conn.send(data2.encode("utf8"))
except Exception:
sel.unregister(conn) def accept(sock,mask): conn, addr = sock.accept()
print("conn",conn)
sel.register(conn,selectors.EVENT_READ,read) sel.register(sock,selectors.EVENT_READ,accept) # 注册事件 while 1: print("wating...")
events=sel.select() # 监听 [(key1,mask1),(key2,mask2)]
for key,mask in events: # print(key.fileobj) # conn
# print(key.data) # read
func=key.data
obj=key.fileobj func(obj,mask) # 1 accept(sock,mask) # 2 read(conn,mask)

链接

Python之阻塞IO模型与非阻塞IO模型的更多相关文章

  1. 转:IO模型-- 同步和阻塞,异步和非阻塞的区别

    源地址 http://hi.baidu.com/deep_pro/item/db0c581af1c1f17e7b5f2534 这些词之间的区别难倒了很多人,还有什么同步阻塞, 同步非阻塞, 异步阻塞, ...

  2. 网络I/O模型--03非阻塞模式(ServerSocket与Socket的超时处理)--解除accept()、 read()方法阻塞

    对于阻塞方式的一种改进是在应用程序层面上将 “一直等待 ”的状态主动打开: 这种模式下,应用程序的线程不再一直等待操作系统的 I/O状态,而是在等待一段时间后就解除阻塞.如果没有得到想要的结果,则再次 ...

  3. 同步IO与同步非阻塞IO的理解

    本文图片均来自网络 一.同步IO---Blocking IO 在Blocking IO模型中,用户空间的应用程序执行一个系统调用(recvform),这会导致应用程序阻塞,直到数据准备好,并且将数据从 ...

  4. 五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O

    五种I/O 模式——阻塞(默认IO模式),非阻塞(常用语管道),I/O多路复用(IO多路复用的应用场景),信号I/O,异步I/O 五种I/O 模式:[1]        阻塞 I/O          ...

  5. java 多线程阻塞队列 与 阻塞方法与和非阻塞方法

    Queue是什么 队列,是一种数据结构.除了优先级队列和LIFO队列外,队列都是以FIFO(先进先出)的方式对各个元素进行排序的.无论使用哪种排序方式,队列的头都是调用remove()或poll()移 ...

  6. 阻塞I/O、非阻塞I/O和I/O多路复用、怎样理解阻塞非阻塞与同步异步的区别?

    “阻塞”与"非阻塞"与"同步"与“异步"不能简单的从字面理解,提供一个从分布式系统角度的回答.1.同步与异步 同步和异步关注的是消息通信机制 (syn ...

  7. 同步I/O、异步I/O与阻塞I/O、非阻塞I/O的区别

    一.I/O I/O (Input/Output,输入/输出)即数据的读取(接收)或写入(发送)操作. 通常用户进程中的一个完整I/O分为两阶段:用户进程空间<-->内核空间.内核空间< ...

  8. (原创)JAVA阻塞队列LinkedBlockingQueue 以及非阻塞队列ConcurrentLinkedQueue 的区别

    阻塞队列:线程安全 按 FIFO(先进先出)排序元素.队列的头部 是在队列中时间最长的元素.队列的尾部 是在队列中时间最短的元素.新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素.链接 ...

  9. php使用flock阻塞写入文件和非阻塞写入文件的实例讲解

    php使用flock阻塞写入文件和非阻塞写入文件的实例讲解: 阻塞写入代码:(所有程序会等待上次程序执行结束才会执行,30秒会超时) <?php $file = fopen("test ...

随机推荐

  1. (六)SpringBoot整合Swagger2框架

    一:什么是Swagger Swagger是一款通过我们添加的注解来对方法进行说明,来自动生成项目的在线api接口文档的web服务. 二:添加Swagger2依赖 <dependency> ...

  2. spring cloud feign 调用接口报错"No message available

    There was an unexpected error (type=Internal Server Error, status=500). status 404 reading HelloServ ...

  3. (四)python自带解释器(IDLE)的使用

    什么是IDE? Integrated Development Environment(集成开发环境) 打个不恰当的比方,如果说写代码是制作一件工艺品,那IDE就是机床.再打个不恰当的比方,PS就是图片 ...

  4. Codeforces 669D Little Artem and Dance (胡搞 + 脑洞)

    题目链接: Codeforces 669D Little Artem and Dance 题目描述: 给一个从1到n的连续序列,有两种操作: 1:序列整体向后移动x个位置, 2:序列中相邻的奇偶位置互 ...

  5. April Fools Contest 2017 D

    Description Input The only line of the input contains a string of digits. The length of the string i ...

  6. Vue项目搭建流程 以及 目录结构构建

    Vue项目搭建流程 以及 目录结构构建 一个小的Vue项目, 基于微信浏览器的移动端, 做了这么多的练习项目, 这一次准备记录下构建的过程, 以方便以后的调高效率 环境准备 操作系统 我的 windo ...

  7. VS Code 自用插件备份

    自用插件备份 Auto Close Tag 自动闭合标签 Atuo Rename Tag 更改前面标签的时候, 自动更改后面的闭合标签 Guides 对齐线 open-in-browser 在浏览器中 ...

  8. 1-13Object类之toString方法

    Object中的toString方法 SUN在Object类中设计toString方法的目的:返回java对象的字符串表示形式. 在现实的开发过程中,Object中的toString方法就是要被重写的 ...

  9. 转 ORACLE数据库ORA-00392 log 4 of thread 1 is being cleared, operation not allowed错误

    现象: 数据库在做to-time recovery, 时候,restore and recover 都是正常的,但是最后一步open resetlogs 报错如下 ORA-00392 原因: 因为是在 ...

  10. JS防止页面被其他网站iframe使用方法

    if(window.top !== window.self){ window.top.location = window.location;} 这句话的意识是说:如果当前窗体不是顶级窗体,就把自己变成 ...