15 并发编程-(IO模型)

一、IO模型介绍

1、阻塞与非阻塞指的是程序的两种运行状态

阻塞:遇到IO就发生阻塞,程序一旦遇到阻塞操作就会停在原地,并且立刻释放CPU资源

非阻塞(就绪态或运行态):没有遇到IO操作,或者通过某种手段让程序即便是遇到IO操作也不会停在原地,执行其他操作,力求尽可能多的占有CPU

2、同步与异步指的是提交任务的两种方式:

同步调用:提交完任务后,就在原地等待,直到任务运行完毕后,拿到任务的返回值,才继续执行下一行代码

异步调用:当进程执行到一个IO(等待外部数据)的时候,不需要等待,待数据接收成功后,再回来处理。

二、阻塞IO模型

默认情况下,所有的socket都是blocking模型,

实际上,除非特别指定,几乎所有的IO接口 ( 包括socket接口 ) 都是阻塞型的。

这给网络编程带来了一个很大的问题,如在调用recv(1024)的同时,线程将被阻塞,在此期间,线程将无法执行任何运算或响应任何的网络请求。

blocking IO的特点就是在IO执行的两个阶段(等待数据和拷贝数据两个阶段)都被block了。

三、非阻塞IO模型

在非阻塞式IO中,用户进程其实是需要不断的主动询问kernel数据准备好了没有。

from socket import *

server = socket(AF_INET, SOCK_STREAM)
server.bind((‘127.0.0.1‘,8083))
server.listen(5)
server.setblocking(False)
print(‘starting...‘)

rlist=[]
wlist=[]
while True:

    try:
        conn, addr = server.accept()
        rlist.append(conn)
        print(rlist)
    except BlockingIOError:
        # print(‘干其他的活‘)

        #收消息
        del_rlist = []
        for conn in rlist:
            try:
                data=conn.recv(1024)
                if not data:
                    del_rlist.append(conn)
                    continue
                wlist.append((conn,data.upper()))
            except BlockingIOError:
                continue
            except Exception:
                conn.close()
                del_rlist.append(conn)

        #发消息
        del_wlist=[]
        for item in wlist:
            try:
                conn=item[0]
                data=item[1]
                conn.send(data)
                del_wlist.append(item)
            except BlockingIOError:
                pass

        for item in del_wlist:
            wlist.remove(item)

        for conn in del_rlist:
            rlist.remove(conn)

server.close()

四、多路复用IO模型

五、异步IO模型

六、各种IO模型对比

七、了解selectors模块的使用

原文地址:https://www.cnblogs.com/foremostxl/p/9738068.html

时间: 2024-10-08 12:08:41

15 并发编程-(IO模型)的相关文章

python并发编程&IO模型

一 IO模型介绍 为了更好地了解IO模型,可先回顾下:同步.异步.阻塞.非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别? 这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西. 这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同.所以,为了

并发编程 - IO模型 - 1.io模型/2.阻塞io/3.非阻塞io/4.多路复用io

1.io模型提交任务得方式: 同步:提交完任务,等结果,执行下一个任务 异步:提交完,接着执行,异步 + 回调 异步不等结果,提交完任务,任务执行完后,会自动触发回调函数同步不等于阻塞: 阻塞:遇到io,自己不处理,os会抢走cpu ,解决办法:监测到io,gevent切换到其他任务,类似欺骗os 非阻塞:cpu 运行 IO分类: 1.阻塞IO blocking IO 2.非阻塞IO nonblocking IO 3.IO多路复用 IO multiplexing 4.信号驱动IO signal

4.6 并发编程/IO模型

目录 4.6.1 背景概念 4.6.2 IO模型概念  4.6.2 IO模型分类 4.6.2.1 阻塞IO  (blocking IO) 4.6.2.2 非阻塞IO  (nonblocking IO) 4.6.2.3 多路复用IO  (IO multiplexing) 4.6.2.4 异步IO(asynchronous IO) 4.6.3 socketserver 模块   4.6.1 背景概念 4.6.2 IO模型概念  4.6.2 IO模型分类 4.6.2.1 阻塞IO  (blocking

并发编程-IO模型

IO模型 模型即解决某个问题的固定套路 I/O 指的是输入输出 IO的问题: 当我们要输入数据或是输出数据通常需要很长一段时间,当然是对于CPU而言 在等待输入的过程中,CPU就处于闲置状态 没事干! 造成了资源浪费 注意: IO其实有很多类型,例如,socket网络IO,内存到内存的copy,等待键盘输入,对比起来socket网络IO需要等待的时间是最长的,这也是咱们重点关注的地方, 学习IO模型要干什么? 就是在等待IO操作的过程中利用CPU,做别的事情 网络IO经历的步骤和过程 操作系统有

Python并发编程-IO模型-非阻塞IO实现SocketServer

Server.py import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.setblocking(False) #把socket中所有需要阻塞的方法都设为非阻塞IO, recv,accept, recvfrom sk.listen() conn_l = [] #保存所有来请求server端conn连接 del_conn = [] #用来存储所有已经与server端断开的conn while True: try: con

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

Server.py import select import socket sk = socket.socket() sk.bind(('127.0.0.1',8080)) sk.setblocking(False) sk.listen() read_lst = [sk] #select监听谁就放入list while True: #[sk,conn] r_lst,w_lst,x_lsx = select.select(read_lst,[],[]) # print('*******',r_ls

进程池与线程池、协程、协程实现TCP服务端并发、IO模型

进程池与线程池.协程.协程实现TCP服务端并发.IO模型 一.进程池与线程池 1.线程池 ''' 开进程开线程都需要消耗资源,只不过两者比较的情况下线程消耗的资源比较少 在计算机能够承受范围内最大限度的利用计算机 什么是池? 在保证计算机硬件安全的情况下最大限度的利用计算机 池其实是降低了程序的运行效率,但是保证了计算机硬件的安全 (硬件的发展跟不上软件的速度) ''' from concurrent.futures import ThreadPoolExecutor import time p

网络编程——IO模型介绍

网络编程--IO模型介绍 IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下:同步.异步.阻塞.非阻塞. 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西.这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(cont

Python并发编程-事件驱动模型

 一.事件驱动模型介绍                                                                                                        1.传统的编程模式  例如:线性模式大致流程 开始--->代码块A--->代码块B--->代码块C--->代码块D--->......--->结束 每一个代码块里是完成各种各样事情的代码,但编程者知道代码块A,B,C,D...的执行顺序,唯一能