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. pycharm 整段缩进

    转自 https://blog.csdn.net/zoulonglong/article/details/79869787 在使用pycharm时,经常会需要多行代码同时缩进.左移,pycharm提供 ...

  2. 交表(Send a Table)

    #include<stdio.h> #include<string.h> #define N 50010 int phi[N],n,sum[N]; void phi_table ...

  3. 通过split命令分割大文件

    场景 线上出了问题,我需要去查找log来定位问题,但是由于线上数据量庞大,这些log文件每过一个小时就会自动回滚一次,尽管如此,有的log文件依然达到了五六g以上的大小. 对于这种巨大的log文件,常 ...

  4. [洛谷P3512 [POI2010]PIL-Pilots]

    题目链接: 传送门走这里 题目分析: 感觉不是很难啊--不像是蓝题(AC量也不像)恶意评分? 少打了一个+1调了半天,就这样居然还能过60pts?我思路和题解第一篇高度重合是什么鬼啊,太过分了吧本来还 ...

  5. LIS 2015百度之星初赛2 HDOJ 5256 序列变换

    题目传送门 题意:中文题面 分析:LIS(非严格):首先我想到了LIS,然而总觉得有点不对:每个数先减去它的下标,防止下面的情况发生:(转载)加入序列是1,2,2,2,3,这样求上升子序列是3,也就是 ...

  6. js修改物理返回键功能

    preventBack: function(theurl){ var pushState = window.history.pushState; //点击物理返回键时,退出到跳转定义首页 if(pus ...

  7. 浏览器上传文件,存到oracle数据库示例。

    这里只贴了一张图, 旨在说明,思路: 将文件转换为字节,存入数据库的类型为 Blob字段. 当下载的时候,从数据库读出来通过流写回浏览器即可 文件的下载. 从数据库读出来通过流写回浏览器即可

  8. JVM初探

    ### JVM分为类的加载生命周期和gc垃圾回收两个大的方面#####首先是类的生命周期, 类的加载: --> 记载字节码 ---> 这个过程有类的加载起参与,双亲委托机制() --> ...

  9. [BZOJ2705][SDOI2012]Longge的问题 数学

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2705 首先分析得题目所求$gcd(i,N)$的取值只可能是$N$的因子,则有$$Ans=\ ...

  10. SEO & HTML语义化

    SEO SEO的概念:搜索引擎优化,常见的搜索引擎有百度.谷歌等.优化的话,就是通过我们的处理,使得我们的网站在搜索引擎下有一个理想的结果. SEO的目的:当用户在搜索引擎上搜索关键词的时候,看到我们 ...