即使您正在使用SocketChannels
,也必须使用线程池进行处理channels
。
考虑到scenairo,您仅使用一个线程负责轮询select()
和处理SocketChannels
从中选择的线程Selectors
,如果一个通道处理需要1秒,并且队列中有10个通道,则意味着您必须等待10秒才能进行下一次轮询是无法忍受的。因此应该有一个线程池用于通道处理。
从这个意义上讲,我认为每个客户端线程阻塞套接字模式没有太大的区别。主要区别在于NIO
模式,任务更小,更像每个任务线程,并且可以读取,写入,biz流程等任务。有关更多详细信息,您可以看看Netty的实现NioServerSocketChannelFactory
,正在使用一个Boss线程接受连接,并将任务分派到Worker线程池中进行处理
如果您真的很喜欢一个线程,那么最起码您至少应该拥有池化的I / O线程,因为I / O操作通常比指令处理周期慢很多,因此您不希望使用宝贵的一个线程被I / O阻塞,这正是NodeJS所做的,使用一个线程接受连接,并且所有I / O都是异步的,并且由后端I / O线程池并行处理
旧样式的“每客户线程数”是否已停用?
我不这么认为,NIO编程很复杂,并且多线程并不是天生的邪恶,请记住,现代操作系统和CPU在多任务处理方面变得越来越好,因此多线程的开销随着时间的推移而变得越来越小。