IO模型

任务的提交方式有两种:

  • 同步:应用程序提交完任务,等待结果结果,之后在执行下一个任务
  • 异步:应用程序提交完任务,继续执行不等待结果,任务执行完,会自动出发异步中的会带哦函数

同步不等于阻塞:

  • 同步:提交任务完,不管任务有没有遇到阻塞,只等待接收结果,任务运行完,才接着往下走
  • 阻塞:提交任务的时候遇到IO,没有处理的话,操作系统就会抢走CPU。解决方法:使用gevent,检测到IO的时候,就切换到其他任务

IO模型的主要分类:

  • 阻塞IO           blocking IO
  • 非阻塞IO       nonblocking IO
  • IO多路复用   IO multiplexing
  • 信号驱动IO   signal driven IO
  • 异步IO          asynchronous IO

遇到IO会阻塞:卡在原地; 网络IO:原地阻塞

1.server端什么样得操作属于IO行为

  • 服务端的accept,recv,send,
  • 其中accept,recv会感觉明显的等,
  • send 不会明显等,但也是IO行为

2.为什么IO行为会让有在原地等待的效果

由于server在recv的时候 会有一个等待的时间,就是等待操作系统缓存中存在数据,才copy到用程序当中

阻塞IO

import socket
from threading import Thread server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5) def communicate():
while True:
try:
data = conn.recv(1024)
print('接收的数据:' ,data)
conn.send(data.upper())
except ConnectionResetError:
break
conn.close() print('setting...')
while True:
print('settings')
conn,client_addr = server.accept() # io阻塞,操作系统拿走了cpu
print(client_addr) t = Thread(target=communicate,args=(conn,))
t.start() server.close()

服务端

import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080)) while True:
cmd = input('>>:').strip()
if not cmd:continue
client.send(cmd.encode('utf-8'))
data = client.recv(1024)
print(data)
phone.close()

客户端

非阻塞IO

应用程序自己检测io,遇到io就切给其他的任务,这样可以使单线程的效率大大提高

存在的问题:

  • cpu在做其他的事情时候,传来了数据,不会立即响应
  • 服务端没有任何的阻塞,就是死循环,cpu会一直的运转,进程处于就绪状态,这样大量占用cpu,让应用程序一直向操作系统询问数据好没好,在做着无用功

多路复用IO

阻塞io: 有wait()等待过程,copy过程,

多路复用io: 比阻塞io多了一个select过程,这个过程可以作为中介,询问操作系统有没有数据

  • 缺点:只有一个套接字的时候比阻塞io性能低,当监测多个套接字的时候,循环慢,列表数据多的话,效率低
  • 优点:多个套接字的时候,可以交给select处理,比阻塞io性能高

elect :列表循环 效率低

poll :可接收得列表数据多 效率也不高

epoll :效率最高,通过异步操作 每个套接字身上绑定个回调函数,谁好了谁触发回调,(就不用去遍历了 效率低)

epoll:  windows 没有 ;linux 有

selectors: 模块 自动根据操作系统选择

import socket
import select
server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(('127.0.0.1',8080))
server.listen(5)
server.setblocking(False)
print('settings') rlist=[server,] #存收的套接字,有两种:conn ,server
wlist=[] #存发的套接字
wdata={} while True:
rl,wl,xl = select.select(rlist,wlist,[],0.5) #去向操作系统问套接字准备好没有,异常列表[] m每隔0.5秒问一次
print('rl',rl)
print('wl',wl) for sock in rl:
if sock == server:
conn,addr = sock.accept()
rlist.append(conn)
else:
try: #适用于windows系统
data = sock.recv(1024)
if not data: #适用于linux系统,会一直收空
sock.close()
rlist.remove(sock)
continue
wlist.append(sock)
wdata[sock] = data.upper()
except Exception: #客户端连接关闭后走这个异常
sock.close()
rlist.remove(sock) for sock in wl:
data = wdata[sock]
sock.send(data)
wlist.remove(sock) #传完数据,就不用监测
wdata.pop(sock) server.close()

服务端

import socket
client = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
client.connect(('127.0.0.1',8080)) while True:
cmd = input('>>:').strip()
if not cmd:continue
client.send(cmd.encode('utf-8'))
data = client.recv(1024)
print(data.decode('utf-8')) phone.close()

客户端

并发编程---IO模型的更多相关文章

  1. 4.6 并发编程/IO模型

    并发编程/IO模型 背景概念 IO模型概念 IO模型分类 阻塞IO  (blocking IO) 特点: 两个阶段(等待数据和拷贝数据两个阶段)都被block 设置 server.setsockopt ...

  2. python 并发编程 io模型 目录

    python 并发编程 IO模型介绍 python 并发编程 socket 服务端 客户端 阻塞io行为 python 并发编程 阻塞IO模型 python 并发编程 非阻塞IO模型 python 并 ...

  3. Python Web学习笔记之并发编程IO模型

    了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...

  4. Python之并发编程-IO模型

    目录 一.IO模型介绍二.阻塞IO(blocking IO)三.非阻塞IO(non-blocking IO)四.多路复用IO(IO multiplexing)五.异步IO(Asynchronous I ...

  5. 并发编程 - io模型 - 总结

    1.提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数2.同步不等于阻塞: 阻塞:遇到io, ...

  6. python并发编程&IO模型

    一 IO模型介绍 为了更好地了解IO模型,可先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(n ...

  7. 并发编程——IO模型

    前言 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义, ...

  8. 并发编程——IO模型详解

    ​ 我是一个Python技术小白,对于我而言,多任务处理一般就借助于多进程以及多线程的方式,在多任务处理中如果涉及到IO操作,则会接触到同步.异步.阻塞.非阻塞等相关概念,当然也是并发编程的基础. ​ ...

  9. 15 并发编程-(IO模型)

    一.IO模型介绍 1.阻塞与非阻塞指的是程序的两种运行状态 阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立刻释放CPU资源 非阻塞(就绪态或运行态):没有遇到IO操作,或者通过某种 ...

  10. 并发编程——IO模型(6)

    1.IO模型分类 同步IO #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用就不会返回.按照这个定义,其实绝大多数函数都是同步调用.但是一般而言,我们在说同步.异步的时候,特指那些需要 ...

随机推荐

  1. SVN创建分支主干策略

    本篇目录 前言 SVN分支管理策略 VisualSVN Server TortoiseSVN客户端 Repository的创建 Check out trunk创建新项目MyProject trunk更 ...

  2. 11:HTML5 发展史

    11:HTML5 发展史 HTML5草案的前身名为 Web Applications 1.0,于2004年被WHATWG提出,于2007年被W3C接纳,并成立了新的 HTML 工作团队. HTML 5 ...

  3. PHP数组(数组正则表达式、数组、预定义数组)

    正则表达式 1.替换 $s = "hello5world"; $s = preg_replace("/\d/","#",$s); echo ...

  4. 数据库系统Informix为例,介绍改善用户查询计划的方法。

    数据库系统Informix为例,介绍改善用户查询计划的方法. 1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率.现在大多数的数据库产品都采用IBM最先提出的ISAM索引 ...

  5. Codeforces 191A - Dynasty Puzzles - [DP]

    题目链接:https://codeforces.com/problemset/problem/191/A 题意: 给出 $n$ 个小写字母组成的字符串,两个字符串如果前者的最后一个字母与后者的首字母相 ...

  6. CCPC-Wannafly Winter Camp Day4 Div1 - 最小边覆盖 - [线段树]

    题目链接:https://zhixincode.com/contest/18/problem/C?problem_id=261 样例输入 1 4 21 23 4 样例输出 1 Yes 样例输入 2 4 ...

  7. 文本分类-TensorRT优化结果对比图

    做的文本二分类,使用tensorRT进行图优化和加速,输出预测概率结果对比如下: 从结果对比来看,概率值有微小的变化,但不影响最终的分类

  8. linux状态及原理全剖析

    Table of Contents 1 linux 1.1 proc filesystem 1.1.1 /proc 1.1.1.1 /proc/meminfo 1.1.1.2 /proc/stat 1 ...

  9. piano class 13

    1,手放在琴键上,不妨碍另外一只手弹奏即可 2,识别五线谱可以加上几条线,减去几条线,一下子就记住了所有的 3,弹得还是有点快,要慢弹奏,四四拍的理论上比四三拍的还要慢,也要看风格 4,四二拍,强弱, ...

  10. screen基本用法

    当某些命令执行时间过长或者某些程序关闭shell后自动断开时,就能使用screen 1.安装yum -y install screen 2.输入screen命令进入screen控制台 3.输入scre ...