阻塞IO

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

非阻塞IO

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

import time
import socket
sk = socket.socket()
sk.bind(('127.0.0.1',))
sk.setblocking(False) # 设置当前的socket server为一个非阻塞IO模型
sk.listen()
conn_l = []
del_l = []
while True:
try:
conn,addr = sk.accept()
conn_l.append(conn) # [conn1,conn2]
except BlockingIOError:
for conn in conn_l: # [conn1,conn2]
try:
conn.send(b'hello')
print(conn.recv())
except (NameError,BlockingIOError):pass
except ConnectionResetError:
conn.close()
del_l.append(conn)
for del_conn in del_l:
conn_l.remove(del_conn)
del_l.clear()

IO多路复用

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

import select  #  模块 用来操作操作系统中的select(IO多路复用)机制
import socket sk = socket.socket()
sk.bind(('127.0.0.1',))
sk.setblocking(False)
sk.listen() r_lst = [sk,]
print(sk)
while True:
r_l,_,_ = select.select(r_lst,[],[]) # r_lst = [sk,conn1,conn2,conn3]
for item in r_l:
if item is sk:
conn, addr = sk.accept()
r_lst.append(conn)
else:
try:
print(item.recv())
item.send(b'hello')
except ConnectionResetError:
item.close()
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. DevOps:从理念到实施

    转载自:http://os.51cto.com/art/201404/436794.htm DevOps这个新理念的出现,是为了应对IT环境中普遍面临的一些挑战.开发团队要求的不断满足新的客户需求,并 ...

  2. 27、Label 自适应文本 xib

    第一步: 第二步: 第三步: 第四步:

  3. Bootstrap之javascript组件

    一 模态框 模态框放在body标签里面的,是body标签的子元素 静态实例: <div class="modal fade" tabindex="-1" ...

  4. ORACLE rollup函数

    rollup函数应用场景: 主要使用在 分组中,将每个分组求汇总值(就是小计),最后再讲所有值(除去小计)求和(就是合计) 当然,使用union 也可以达到同样的效果.先将需要查询的分组查出来,再un ...

  5. extjs如何使用

    刚学ExtJs 不知道如何使用.. 我的操作步骤如下: 1. 在项目中导入ExtJs 2. 创建了一个one.js 和 helloworld.html 3. one.js中的代码如下: Ext.Mes ...

  6. 2019.01.23 hdu3377 Plan(轮廓线dp)

    传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...

  7. 将驼峰转化为下化线(将型如AbcDef转化为abc_def)

    strtolower(preg_replace('/((?<=[a-z])(?=[A-Z]))/', '_', 'AbcDef'))

  8. poj-3667(线段树区间合并)

    题目链接:传送门 参考文章:传送门 思路:线段树区间合并问题,每次查询到满足线段树的区间最左值,然后更新线段树. #include<iostream> #include<cstdio ...

  9. js动态删除某一行,内容超出单元格后超出的部分用省略号代替

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <s ...

  10. ng-show和ng-if的区别和使用场景

    一.ng-show(ng-hide)和ng-if都是控制标签的显示和隐藏,为什么angularjs会定义两个指令来供我们使用呢,不多多说肯定有各自的使用场景,接下来我们看哈实际原理: ng-show实 ...