码迷,mamicode.com
首页 > 其他好文 > 详细

15 并发编程-(IO模型)

时间:2018-10-03 00:45:33      阅读:240      评论:0      收藏:0      [点我收藏+]

标签:erro   任务   png   包括   操作   except   append   两种   sele   

一、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()
View Code

技术分享图片

四、多路复用IO模型

技术分享图片

 

五、异步IO模型

六、各种IO模型对比

七、了解selectors模块的使用

 

15 并发编程-(IO模型)

标签:erro   任务   png   包括   操作   except   append   两种   sele   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!