nio多路复用使用线程池的一个疑问?
常常会将线程池模型和多路复用模型进行对比,多路复用模型一个线程就能hold住所有链接,不需要像多线程模型那样造成线程切换,但是在真实使用多路复用模型的时候,都会搭配一个work线程池来对返回结果进行处理,多路复用只用来监听链接,那么这不就又回到多线程模型了么,这个work线程池难道不会造成上下文切换么?还是说这个work线程池的上下文切换很小和线程池大小也很小?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
java nio 在 linux 是默认采用
select
或poll
,或epoll
实现的,过程差不多。比如epoll
只是一组系统调用(包括epoll_create
,epoll_ctl
,epoll_wait
),开发人员可以使用这组系统调用完成多路复用。每次epoll_wait的时候可以阻塞等待获得有事件的连接(poll_events
),然后开发人员根据需要去read
或write
每一个连接,此时你可以串行处理,或多线程处理,这个跟epoll
没有关系。那么问题就在于这个多线程,开发人员使用了线程池设置多少能最大限度发挥性能的问题了。
一般经验是这个线程池设置为合适的数目,减少上下文切换。
针对io密集型,经验计算公式:线程数 = CPU核心数/(1-阻塞系数)
其中阻塞系统一般在0.8-0.9左右。
这个线程数还可以通过实际压测来确定。
https://segmentfault.com/a/11...