python--->io模式详解(适合零基础)

简介:

在此感谢前辈们指导,此处是我自己的理解,部分图片和段落来源于http://www.cnblogs.com/alex3714/articles/5876749.html

http://www.cnblogs.com/Anker/p/3254269.html

如果在学习过程中遇到了问题,请咨询:2775724349(因为自己时间有限,所以可能不会常回复,但会收集每个星期大家所遇到的问题,在周六以博文形式在博客中发表)

阻塞 I/O(blocking IO)

720333-20160916171008617-1558216223.png (552×331)

12230408-c8b30331f20a41dcb224d20719ffa1da.png (722×325)

当进程开始read想读取数据时,用recv函数从内存中取数据,但是呢,内存中的数据,没有准备好,怎么办呢,这个时候就不断地开始等待,等到数据准备好后,就会结束阻塞状态,开始拷贝数据,然后发送给用户。

一个粗略的比方:我和女票出去逛街培养感情。顺便先去餐厅吃个饭

(1)我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。

女友本想还和我一起逛街的,但是不知道饭能什么时候做好,只好和我一起在餐厅等,而不能去逛街,直到吃完饭才能去逛街,中间等待做饭的时间浪费掉了。这就是典型的阻塞

一句话来讲;

blocking IO的特点就是在IO执行的两个阶段都被block了。

非阻塞 I/O(nonblocking IO)

720333-20160916171226852-1916489268.png (603×333)

12231306-35dca310d92e4184bd4c0b3f42bee2c1.png (642×342)

当一个用户想用到数据,调用recv函数时,,发消息给内存,但是内存说:大兄弟,我还没准备好。然后返回一个error(消息)给用户,但用户的系统是个急性子,心想:老大找我要啊。你也快点吧。说完,又继续发了一个消息给内核,直到数据准备好,才结束访问

比方:

(2)我女友不甘心白白在这等,又想去逛商场,又担心饭好了。所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了啦。这就是非阻塞。需要不断的询问,是否准备好了。

I/O 多路复用( IO multiplexing)

IO multiplexing就是我们说的select,poll,epoll,有些地方也称这种IO方式为event driven IO。select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select,poll,epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。

这个就开始变得复杂了,接下来我尽量说大白话。先上图:

720333-20160916171333523-650292614.png (609×326)

12232204-08fdf03d1d8a40a68d2286c6c43fb036.png (663×352)

为了增强大家的理解,我首先将第三种与前两种,进行对比

对于第一种和第二种阻塞 I/O(blocking IO):如果在单线程下采取这种方案,一收数据,就阻塞,一收数据就阻塞,那如果我要一下子收多个数据怎么办呢,那还不玩儿完,所以这时不能在多个socket下接收数据,即便后面继续来了数据,也得等着,因为前面卡住了

但是对于这一种,假如单线程下一下子向100个socket发送数据,然后在这100个socket来个for循环,等候他们发的数据,一个循环过后,接收到了5个数据,那么就开始拷贝数据,发送给用户,有人会想,那其他的了,就不会在意了,因为 ,我已经接收到了数据。

select,poll,epoll作用就是在不断地循环,进行筛选 。

再重复一遍select连接上100个socket句柄,然后内核就开始检测这100个句柄,哪怕有一个人接收到了数据,他就把数据返回

接下来,介绍一个更加牛B的io

异步 I/O(asynchronous IO)

720333-20160916171458461-2052304822.png (572×324)

12233159-16ec6876a48d424d8e6b524d1fb91689.png (656×334)

异步io先调用函数发通知给内核,但是,内核说我没有数据,返回一个消息,然后用户就开始做其他的事了,等到内核把数据拷贝完,就把函数直接调用给用户,可能后来一点大家话是云里雾里的,用一个抽像的比方:

我和女票不是要出去吃饭吗,我们不出去吃了,直接在家里点外卖,等外卖来了,才开始吃饭,饭吃完了,就可以直接出去玩儿。,在这期间,我和女票爱干嘛干嘛,外卖都管不着,对用户造不成影响。

相当于内核帮我们等,但是我们不需要等。这个地方与三者的区别在于,前三者,在将数据准备好后,用户还需要read一下,read过程中,可能会卡,但是这个绝不会卡。

      

     non-blocking IO就是blocking IO在执行recvfrom这个system call的时候,如果kernel的数据没有准备好,这时候不会block进程。但是,当kernel中数据准备好的时候,recvfrom会将数据从kernel拷贝到用户内存中,这个时候进程是被block了,在这段时间内,进程是被block的。

     而asynchronous IO则不一样,当进程发起IO 操作之后,就直接返回再也不理睬了,直到kernel发送一个信号,告诉进程说IO完成。在这整个过程中,进程完全没有被block。

 四种图片对比

720333-20160916171648430-240094129.png (614×327)

好了,就是这样了。最后一种最牛B,






      本文转自眉间雪 51CTO博客,原文链接:http://blog.51cto.com/13348847/1979024,如需转载请自行联系原作者





相关文章
|
18天前
|
算法 数据处理 Python
Python并发编程:解密异步IO与多线程
本文将深入探讨Python中的并发编程技术,重点介绍异步IO和多线程两种常见的并发模型。通过对比它们的特点、适用场景和实现方式,帮助读者更好地理解并发编程的核心概念,并掌握在不同场景下选择合适的并发模型的方法。
|
1月前
|
调度 数据库 Python
Python中的并发编程:使用asyncio库实现异步IO
传统的Python程序在面对IO密集型任务时,往往会遇到性能瓶颈。本文将介绍如何利用Python中的asyncio库,通过异步IO的方式来提升程序的效率和性能,让你的Python程序能够更好地处理并发任务。
|
1月前
|
自然语言处理 算法 数据挖掘
Python怎么实现模式匹配
Python怎么实现模式匹配
18 0
|
1月前
|
存储 Python
如何在Python中读取文件的权限模式?
【2月更文挑战第15天】【2月更文挑战第44篇】如何在Python中读取文件的权限模式?
|
1月前
|
Python
在Python中,如何指定文件的读取和写入模式?
【2月更文挑战第10天】【2月更文挑战第27篇】在Python中,如何指定文件的读取和写入模式?
|
2月前
|
程序员 调度 云计算
Python并发编程的未来趋势:协程、异步IO与多进程的融合
Python并发编程的未来趋势:协程、异步IO与多进程的融合
|
2月前
|
数据采集 Python
Python多线程与异步IO的对比:何时选择哪种并发模型
Python多线程与异步IO的对比:何时选择哪种并发模型
|
2月前
|
开发者 Python
Python中的并发编程与异步IO
在当今快节奏的互联网时代,如何提高程序的执行效率成为了开发者们关注的焦点。本文将探讨Python中的并发编程与异步IO技术,介绍其原理、应用场景以及优缺点,帮助读者更好地理解和运用这些技术来提升程序性能。
|
2月前
|
并行计算 开发者 Python
Python中的并发编程:异步IO与多线程比较
本文将探讨Python中的并发编程方法,着重比较异步IO和多线程两种不同的实现方式。通过对它们的特点、优缺点以及适用场景进行分析,帮助读者更好地理解并发编程在Python中的应用。
24 1
|
2月前
|
大数据 程序员 Python
Python中的异步编程:使用asyncio库实现高效IO操作
传统的同步编程模式在处理IO密集型任务时效率较低,因此异步编程成为了解决这一问题的关键。本文将介绍如何利用Python中的asyncio库实现异步编程,以及如何利用异步特性提高IO操作的效率,让你的程序更加响应迅速。

热门文章

最新文章