您的位置:首页 > 其它

异步IO的一些理解

2017-05-21 19:24 225 查看
转载地址:

http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143208573480558080fa77514407cb23834c78c6c7309000

廖大的python教程中的异步IO编程,一些网友的见解。Mark下来学习。

(匿名sina网友V)

I/O模型,同步异步,阻塞非阻塞是些概念困扰了我很长时间.

能上图就好了,一图胜千言.

图在UNIX网络编程 第三版 卷1 中文盗版 第六章

图6-6 5种I/O模型的比较

UNIX有5种I/O模型,阻塞会发生在两个阶段上:

1.阻塞式I/O 等待数据时阻塞 数据从内核复制到用户空间时阻塞

2.非阻塞式I/O 等待数据不阻塞,但是轮询会占用cpu资源 数据从内核复制到用户空间时阻塞

3.I/O复用 考虑到轮询占用cpu资源的问题,阻塞在选择器上,减轻处理器负担 将数据从内核复制到用户空间时阻塞

4.信号驱动式I/O 等待数据不阻塞,数据准备好时通知接收数据,将数据从内核复制到用户空间时阻塞

以上四种或多或少均有阻塞现象存在,它们都是同步I/O模型

5.异步I/O 等待数据时不阻塞 将数据从内核复制到用户空间时也不阻塞. 数据到了用户空间以后才发信号,就像你在网上下了订单,快递员拿着你的快件站在你家门口才通知你开门签收的样子.

而在网上下了订单,货物到了离你家最近的自提点,商城通知你去自提点取提货.你专门抽出时间去提货.这是4.信号驱动式I/O.因为在来回自提点的路上你其实是阻塞的.


(Zs一只小小神痩sZ)

老张爱喝茶,废话不说,煮开水。

出场人物:老张,水壶两把(普通水壶,简称水壶;会响的水壶,简称响水壶)。

1 老张把水壶放到火上,立等水开。(同步阻塞

老张觉得自己有点傻

2 老张把水壶放到火上,去客厅看电视,时不时去厨房看看水开没有。(同步非阻塞

老张还是觉得自己有点傻,于是变高端了,买了把会响笛的那种水壶。水开之后,能大声发出嘀~~~~的噪音。

3 老张把响水壶放到火上,立等水开。(异步阻塞

老张觉得这样傻等意义不大

4 老张把响水壶放到火上,去客厅看电视,水壶响之前不再去看它了,响了再去拿壶。(异步非阻塞

老张觉得自己聪明了。

所谓同步异步,只是对于水壶而言。

普通水壶,同步;响水壶,异步。

虽然都能干活,但响水壶可以在自己完工之后,提示老张水开了。这是普通水壶所不能及的。

同步只能让调用者去轮询自己(情况2中),造成老张效率的低下。

所谓阻塞非阻塞,仅仅对于老张而言。

立等的老张,阻塞;看电视的老张,非阻塞

情况1和情况3中老张就是阻塞的,媳妇喊他都不知道。虽然3中响水壶是异步的,可对于立等的老张没有太大的意义。所以一般异步是配合非阻塞使用的,这样才能发挥异步的效用。

(solozhang1769 )

多线程和异步,是处理大并发的两种不同的方式。多线程的处理方式一般是这样:一个主线程,负责监听,一旦请求来了,就起一个线程,处理完,就将这个线程回收。而异步是在同一个线程里,轮番接受请求,再交给业务逻辑去处理,跟“多路复用”说的是同一回事。

阻塞和非阻塞是等待方式的区别,比如你去取钱,等待过程中,你一直在那边等,什么事情都做不了;而非阻塞是先给一个结果“可能要花点时间,你去抽根烟吧”。而同步和异步是通知方式的差别,同步就是,你抽烟过程中,还不断的问“钱出来了吗?钱出来了么?”,是你主动去问的。而异步就是,你取钱的时候,柜员给了你一张小纸条说“钱好了叫你”,注意,是柜员通知你。综述,阻塞是同步的,异步一定是非阻塞的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: