阻塞IO

  1. socket 一定会用到accept recv recvfrom这些方法
    正常情况下 accept recv recvfrom都是阻塞的

非阻塞IO

  1. 如果setblocking(False) 整个程序就变成一个非阻塞的程序了
  1. 非阻塞的特点:
      没有并发编程的机制
      是一个同步的程序
      程序不会在某一个连接的recv或者skaccept上进行阻塞
    缺点:
      太多while True 高速运行着
      大量的占用了CPU导致了资源的浪费
  1. 阻塞IO的问题:
    一旦阻塞就不能做其他事情了
    非阻塞IO的问题:
    CPU造成了很大的负担

  1. import time
  2. import socket
  3. sk = socket.socket()
  4. sk.bind(('127.0.0.1',))
  5. sk.setblocking(False) # 设置当前的socket server为一个非阻塞IO模型
  6. sk.listen()
  7. conn_l = []
  8. del_l = []
  9. while True:
  10. try:
  11. conn,addr = sk.accept()
  12. conn_l.append(conn) # [conn1,conn2]
  13. except BlockingIOError:
  14. for conn in conn_l: # [conn1,conn2]
  15. try:
  16. conn.send(b'hello')
  17. print(conn.recv())
  18. except (NameError,BlockingIOError):pass
  19. except ConnectionResetError:
  20. conn.close()
  21. del_l.append(conn)
  22. for del_conn in del_l:
  23. conn_l.remove(del_conn)
  24. del_l.clear()

IO多路复用

  1. io多路复用机制
    select windowsmac\linux
    底层是操作系统的轮询
    有监听对象个数的限制
    随着监听对象的个数增加,效率降低
    poll mac\linux
    底层是操作系统的轮询
    有监听对象个数的限制,但是比select能监听的个数多
    随着监听对象的个数增加,效率降低
    epoll mac\linux
    给每一个要监听的对象都绑定了一个回调函数
    不再受到个数增加 效率降低的影响

  1. import select # 模块 用来操作操作系统中的select(IO多路复用)机制
  2. import socket
  3.  
  4. sk = socket.socket()
  5. sk.bind(('127.0.0.1',))
  6. sk.setblocking(False)
  7. sk.listen()
  8.  
  9. r_lst = [sk,]
  10. print(sk)
  11. while True:
  12. r_l,_,_ = select.select(r_lst,[],[]) # r_lst = [sk,conn1,conn2,conn3]
  13. for item in r_l:
  14. if item is sk:
  15. conn, addr = sk.accept()
  16. r_lst.append(conn)
  17. else:
  18. try:
  19. print(item.recv())
  20. item.send(b'hello')
  21. except ConnectionResetError:
  22. item.close()
  23. r_lst.remove(item)

IO模型 IO多路复用的更多相关文章

  1. IO 模型 IO 多路复用

    IO 模型 IO 多路复用 IO多路复用:模型(解决问题的方案) 同步:一个任务提交以后,等待任务执行结束,才能继续下一个任务 异步:不需要等待任务执行结束, 阻塞:IO阻塞,程序卡住了 非阻塞:不阻 ...

  2. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  3. 【经典】5种IO模型 | IO多路复用

    上篇回顾:静态服务器+压测 3.2.概念篇 1.同步与异步 同步是指一个任务的完成需要依赖另外一个任务时,只有等待被依赖的任务完成后,依赖的任务才能算完成. 异步是指不需要等待被依赖的任务完成,只是通 ...

  4. 五种网络IO模型以及多路复用IO中select/epoll对比

    下面都是以网络读数据为例 [2阶段网络IO] 第一阶段:等待数据 wait for data 第二阶段:从内核复制数据到用户 copy data from kernel to user 下面是5种网络 ...

  5. IO模型——IO多路复用机制

    (1)I/O多路复用技术通过把多个I/O的阻塞复用到同一个select.poll或epoll的阻塞上,从而使得系统在单线程的情况下可以同时处理多个客户端请求.与传统的多线程/多进程模型比,I/O多路复 ...

  6. Python并发编程-IO模型-IO多路复用实现SocketServer

    Server.py import select import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.setblockin ...

  7. IO模型之IO多路复用 异步IO select poll epoll 的用法

    IO 模型之 多路复用 IO 多路复用IO IO multiplexing 这个词可能有点陌生,但是如果我说 select/epoll ,大概就都能明白了.有些地方也称这种IO方式为 事件驱动IO ( ...

  8. 03 高性能IO模型:采用多路复用机制的“单线程”Redis

    本篇重点 三个问题: "Redis真的只有单线程吗?""为什么用单线程?""单线程为什么这么快?" "Redis真的只有单线程吗? ...

  9. 网络编程并发 多进程 进程池,互斥锁,信号量,IO模型

    进程:程序正在执行的过程,就是一个正在执行的任务,而负责执行任务的就是cpu 操作系统:操作系统就是一个协调.管理和控制计算机硬件资源和软件资源的控制程序. 操作系统的作用: 1:隐藏丑陋复杂的硬件接 ...

随机推荐

  1. centos6.5虚拟机每次都要ifup eth0的解决办法

    修改文件/etc/sysconfig/network-scripts/ifcfg-eth0把ONBOOT=no改ONBOOT=yes

  2. log4j介绍和使用

    1.apache推出的开源免费日志处理的类库 2.为什么需要日志?? 2.1 在项目中编写system.out.println();输出到控制台,当项目发布到tomcat后,没有控制台(在命令界面能看 ...

  3. 关于Cell中的各种值的类型判断

    switch (cell.getCellType()){ case Cell.CELL_TYPE_NUMERIC: //数字 cellValue = stringDateProcess(cell); ...

  4. springboot Thymeleaf 整合

    Thymeleaf是一个Java模板引擎开发库,可以处理和生成HTML.XML.JavaScript.CSS和文本,在Web和非Web环境下都可以正常工作. Thymeleaf可以跟Spring bo ...

  5. Excel2007VBA数组和工作表及单元格的引用

    动态数组使用: https://zhidao.baidu.com/question/1432222709706721499.html 使用Redim动态数组即可. 1 2 3 4 5 6 7 8 Su ...

  6. DocumentType类型

    并不常用 nodeType 10 nodeName doctype的名称 NodeValue 值为null parentNode Document 不支持子节点 DocumentType不能动态创建, ...

  7. powerdesiginer 生成oracle脚本问题,一步解决

    select * from tablename时, 总是提示错误:table or view does not exits 但是在user_tables中却可以看到刚建立的表. 原因是powerDes ...

  8. RestTemplate将响应数据转换为具有泛型的类对象

    前言: 重要,RestTemplate在SpringBoot项目里即便通过HttpMessageConverters添加了Fastjson且优先级比jackson要高也不会在RestTemplate里 ...

  9. Linux中的sleep、usleep、nanosleep、poll和select

    在进行Linux C/C++编程时,可调用的sleep函数有好多个,那么究竟应当调用哪一个了?下表列出了这几个函数间的异同点,可作为参考: 性质 精准度 线程安全 信号安全 sleep libc库函数 ...

  10. 1057 Stack 树状数组

    Stack is one of the most fundamental data structures, which is based on the principle of Last In Fir ...