多路复用适用于需要保持大量闲置(区别于计算密集型)长连接的业务场景,例如聊天室。这样的好处是能够避免不断的创建新线程,导致系统资源浪费。需要注意,多路复用本质上是复用单线程的,回调函数的执行必然是有可能长时间阻塞的,所以如果涉及到耗时的计算密集型任务,则会大大降低系统处理其它连接的响应速度。
线程池则适合短连接并发的情况,比如普通的web业务系统,Tomcat的Servlet容器默认选择就是线程池(虽然3.0后支持异步,但一般情况下不常使用)。由于处理短连接的线程很快会退出,因此能够充分发挥线程池复用线程的好处。
当然,多路复用和线程池可以结合起来使用,效果也许更好,但代码复杂度也会相应提高,需要更好的设计。建议根据业务场景选择相应的技术,避免过早优化。
一点补充:很多人不知道协程该归于哪个技术范畴。协程除了在用户态通过栈切换实现控制流的切换以外,还通常将多路复用和线程池结合起来。比如go语言内置的协程就是在多线程的基础上实现了一套调度策略,调度策略的实现建立在操作系统内核提供的IO多路复用技术之上,同时go语言参考计算机硬件情况自动将协程绑定在若干个系统线程之上,从而实现资源的高效率利用。
网友评论