同步异步 阻塞非阻塞(NIO) IO线程多路复用 极简阐述


同步异步 阻塞非阻塞:
废话不说,老张爱喝茶,煮开水,有两个水壶,普通水壶,响水壶(水开会提示)(引自
同步就是普通水壶烧开水,要没事儿自己过来来看开没开;
异步就是响水壶烧开水,水开了水壶响了通知你。
阻塞是烧开水的过程中,你不能干其他事情(即你被阻塞住了);
非阻塞是烧开水的过程里可以干其他事情。比如出去和老相好聊聊天,去客厅看看电视;
同步与异步说的是你获得水开了的方式不同。
阻塞与非阻塞说的是你得到结果之前能不能干其他事情。两组概念描述的是不同的内容。
这里你看明白了,就会发现:
最好的办法是 响水壶烧水(异步),烧开提示你之前可以去干别的事儿(非阻塞)
所以异步和非阻塞常常在一起

IO多路复用:
IO操作非常耗时,并且是同步的(即普通水壶水开了也不会通知你,必须得自己过来检查)
问题描述:1000个socketIO线程在写入数据,IO完成后进行下一步操作(如复制,增删等)
1000个socketIO线程相当于烧1000壶水
多线程阻塞模型下,需要1000个socket处理线程,相当于1000个老张都要等待自己烧的水开(IO操作完毕),然后沏茶。
阻塞线程;
1000个老张站在对应的水壶前不能移动(线程挂起),直到自己的水开了

非阻塞线程:
老张不用等待水开,没事儿回来看一眼,看到没开(返回)就干别的去,一会回来再看;

IO线程多路复用:
即使是非阻塞,每个老张都得等待自己的水开,没事儿就得回来看也非常麻烦;
怎么办?
找一个小徐负责查看1000个水壶,发现水开了就通知老张(类似异步通知,因而被称作伪异步)
一旦有水开,老张就可以来沏茶,等待小徐通知下一个,这样一个老张就够了,或者多个老张(线程池)




通过单一线程监视每个socketIO线程状态(伪异步)
IO完成后通知单个或多个socket处理线程进行下一步处理

猜你喜欢

转载自blog.csdn.net/evanxuhe/article/details/79629109