永发信息网

为什么 IO 多路复用要搭配非阻塞 IO

答案:1  悬赏:0  手机版
解决时间 2021-01-08 06:41
为什么 IO 多路复用要搭配非阻塞 IO
最佳答案
看 Tornado 源码时候,我也产生了同样的疑问。

首先基于 Reactor 模型,socket.fd 已经被放到 ioloop(事件循环) 中,通过多路复用监听到 fd 已可用,并开始调用对应的事件处理函数(handle_read/hanle_accept)。

def handle_read():
socket.setblocking(False)
while True:
try:
data = socket.recv(1024)
except socket.error, e:
if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN):
return
raise

def handle_accept():
socket.setblocking(False)
while True:
try:
connection, address = socket.accept()
except socket.error, e:
if e.args[0] in (errno.EWOULDBLOCK, errno.EAGAIN):
return
raise

假如 socket 的读缓冲区中已有足够多的数据,需要调用三次 read 才能读取完。或 ACCEPT 队列已经有三个「握手已完成的连接」。

非阻塞 I/O 的处理方式:循环的 read 或 accept,直到读完所有的数据(抛出 EWOULDBLOCK 异常)。

阻塞 I/O 的处理方式:每次只能调用一次 read 或 accept,因为多路复用只会告诉你 fd 对应的 socket 可读了,但不会告诉你有多少的数据可读,所以在
handle_read/handle_accept 中只能 read/accept 一次,你无法知道下一次 read/accept
会不会发生阻塞。所以只能等 ioloop 的第二次循环,ioloop 告诉你 fd 可用后再继续调用
handle_read/handle_accept 处理,然后再循环第三次。

所以你会发现,后者的处理方式要复杂很多,稍不注意就会阻塞整个进程。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
博艺汽车养护会所地址有知道的么?有点事想过
windows7 with sp1是什么
玫琳凯时尚白色手表
北京巨弦音乐文化有限公司怎么样?
单选题日本进口的工业原料与原料出口国之间的
古名人对美女隹人有哪几种称呼较为流传
滴滴公司不顾滴滴司机能有多少收入,不顾乘客
Britain TodayFoodBritish people like good
一上qq鼠标没反应
打篮球手指被戳到怎么办
从草场上收割牧草制作干草,每公斤成本大概多
帮我看看这颗松石怎么样。1.5的圆珠
道法二字作一对联
或跃在渊什么意思
扑克牌中红桃4代表什么含义?
推荐资讯
大连做一顿饭多少钱
一圆锥的底面半径为1cm,母线长2cm,则该圆锥
AirPods一个耳机多少钱
女人上围99/101下围83/87是多大罩杯
男友要看我上厕所
数据挖掘概念与技术第六章是不是有错误
香港哪里可以买到ASOS,麻烦告知一下,十分谢
问福州华南实验小学好不好
每天都SY对身体有害处么
钾离子和低钾是不是一样的
如何发展现代烟草农业
原装日本小松50价格?
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?