首页 > 怎么理解IO多路复用(select)?

怎么理解IO多路复用(select)?

sockfd1,sockfd2,sockfd3..sockfdn 同时监听这n个客户,当其中有一个发来消息
时就从select的阻塞中返回,然后就调用read 读取收到消息的sockfd,然后又循环回select 阻塞;
这样就不会因为阻塞在其中一个上而不能处 理另一个客户的消息

我的问题是:

那这样子,在读取sockfd1的数据时,如果其它socket有数据来,那么也要等到sockfd1读取完了才能继续读取其它socket的数据吧。那这样子如果sockfd1的数据如果读取比较费时,那么其它socket不就被阻塞住了吗? 而且读取到的数据也要开启线程处理吧,那这和开启多个线程进行socket IO有什么区别呢?


第一个确实会堵塞,但是读取会很快,都是在内存操作,基本上这里不会是瓶颈。

真正瓶颈一般就出现在你说的『读取到的数据也要开启线程处理』这块。数据处理如果需要大量计算或磁盘IO这种耗时较长的操作,确实是需要用开启线程处理。但也有不少情况是无需开启线程的,这就是纯事件驱动了,比如nginx作为简单的反向代理,只是把请求收进来再转出去,就无需多线程。

开启线程这块往往不是一个请求就建一个新线程,而是预先分配好线程池。

另外我们还可以把干活的线程池给移出去,放到别的进程或者机器上,这样当前的处理进程就没什么重活,也就无需多线程了,就像前面说的请求收进来简单处理就丢出去一样。


第一问,是被阻塞了。

“读取到的数据也要开启线程处理”,这句话没太看懂。

【热门文章】
【热门文章】