标题为: 为什么netty每个插槽共享相同的线程进行读写?
当netty写入时,netty将转换为一个任务并使用相同的线程进行读取。为什么不打开另一个专门用于写入的线程,以便提高性能?
the old one: read1->write1->read2->write2. //read 1 will wait write 1 time to read 2.
the new one: thread A read1->read2 //no wait to go to read2
thread B write1->write2
所以最初的三个线程池:
一个接受 一个阅读 一个写作
答案 0 :(得分:4)
有很多原因。
首先,无论如何,读写操作都不会进行任何繁重的操作。读取操作仅收集已经处理的数据,并且写入操作仅调度要写入的数据。因此,增加的复杂性不会带来太大的性能提升。
其次,典型的服务器或客户端节奏无论如何都会交替发送和接收。使用发送线程和接收线程,此节奏需要将数据从一个线程传递到另一个线程,这往往效率低下。您还需要排队以在线程和背压之间进行调整以处理队列填充。如果您在写作时继续阅读,那么您在哪里放置数据?你只是在内存中缓冲它吗?
第三,更多线程意味着更多的资源消耗和更多的上下文切换。要处理典型的接收进程发送周期,您至少需要一个额外的上下文切换。如果您正在处理大量连接,这意味着需要更多线程,这使得一个连接更容易获得更多的资源。
最后,如果你使用像TLS这样的协议,你的发送和接收逻辑将具有相互依赖性。所以你的线程最终会等待彼此。