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,如需转载请自行联系原作者





相关文章
|
1月前
|
并行计算 数据处理 Python
Python并发编程迷雾:IO密集型为何偏爱异步?CPU密集型又该如何应对?
在Python的并发编程世界中,没有万能的解决方案,只有最适合特定场景的方法。希望本文能够为你拨开迷雾,找到那条通往高效并发编程的光明大道。
42 2
|
2月前
|
开发框架 并行计算 算法
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
揭秘Python并发神器:IO密集型与CPU密集型任务的异步革命,你竟还傻傻分不清?
46 4
|
1月前
|
监控 并行计算 数据处理
构建高效Python应用:并发与异步编程的实战秘籍,IO与CPU密集型任务一网打尽!
在Python编程的征途中,面对日益增长的性能需求,如何构建高效的应用成为了每位开发者必须面对的课题。并发与异步编程作为提升程序性能的两大法宝,在处理IO密集型与CPU密集型任务时展现出了巨大的潜力。今天,我们将深入探讨这些技术的最佳实践,助你打造高效Python应用。
38 0
|
23天前
|
设计模式 开发者 Python
Python编程中的设计模式:工厂方法模式###
本文深入浅出地探讨了Python编程中的一种重要设计模式——工厂方法模式。通过具体案例和代码示例,我们将了解工厂方法模式的定义、应用场景、实现步骤以及其优势与潜在缺点。无论你是Python新手还是有经验的开发者,都能从本文中获得关于如何在实际项目中有效应用工厂方法模式的启发。 ###
|
21天前
|
网络协议 物联网 API
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第26天】Python 是一门功能强大且易于学习的编程语言,Twisted 框架以其事件驱动和异步IO处理能力,在网络编程领域独树一帜。本文深入探讨 Twisted 的异步IO机制,并通过实战示例展示其强大功能。示例包括创建简单HTTP服务器,展示如何高效处理大量并发连接。
39 1
|
28天前
|
数据可视化 算法 JavaScript
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
本文探讨了如何利用图论分析时间序列数据的平稳性和连通性。通过将时间序列数据转换为图结构,计算片段间的相似性,并构建连通图,可以揭示数据中的隐藏模式。文章介绍了平稳性的概念,提出了基于图的平稳性度量,并展示了图分区在可视化平稳性中的应用。此外,还模拟了不同平稳性和非平稳性程度的信号,分析了图度量的变化,为时间序列数据分析提供了新视角。
54 0
基于图论的时间序列数据平稳性与连通性分析:利用图形、数学和 Python 揭示时间序列数据中的隐藏模式
|
2月前
|
算法 数据挖掘 Python
Python中的拟合技术:揭示数据背后的模式
Python中的拟合技术:揭示数据背后的模式
40 0
Python中的拟合技术:揭示数据背后的模式
|
19天前
|
Python
探索Python中的异步编程模式
【10月更文挑战第29天】在编程世界中,时间就是效率。Python的异步编程模式,就像是给程序装上了翅膀,让任务并行处理不再是梦想。本文将带你了解如何在Python中实现异步编程,解锁高效代码的秘密。
25 0
|
20天前
|
网络协议 调度 开发者
Python网络编程:Twisted框架的异步IO处理与实战
【10月更文挑战第27天】本文介绍了Python网络编程中的Twisted框架,重点讲解了其异步IO处理机制。通过反应器模式,Twisted能够在单线程中高效处理多个网络连接。文章提供了两个实战示例:一个简单的Echo服务器和一个HTTP服务器,展示了Twisted的强大功能和灵活性。
30 0
|
1月前
|
开发框架 并行计算 .NET
脑洞大开!Python并发与异步编程的哲学思考:IO密集型与CPU密集型任务的智慧选择!
脑洞大开!Python并发与异步编程的哲学思考:IO密集型与CPU密集型任务的智慧选择!
29 1