我想了解netty worker threads的工作原理。根据代码,对于每个新请求,我们得到nextwoker()任何一个工作线程并分配它来处理客户端的事件。因此,根据我的理解,单个线程将能够处理来自不同客户端的不同请求。
我在这里有一个问题:对于客户端(通道/套接字),来自该特定通道的所有事件是由同一个线程处理还是不同的线程可以处理它们。 我的假设是单线程处理所有事件(不包括Future事件)。 但是根据MemoryAwareThreadPoolExecutor的文档,他们告诉对于一个通道 - 不同的线程处理不同的事件。
为了验证这一点,我使用单个客户端和工作者threadppol写了一个小程序,它有50个工作线程但是当我在消息接收事件中保持睡眠时,我的客户端等待下一个消息接收呼叫。这确认了每个客户端的单个线程被分配。 请澄清......
答案 0 :(得分:2)
同一个Worker线程将一直用于Channel。因此可以安全地理解这种情况。
如果您使用OrderedMemoryAwareThreadPoolExecutor,则可能不再是这种情况。
答案 1 :(得分:0)
根据我的理解,Netty使用工作线程来处理传入的连接。
你不应该阻塞(睡眠)这些工作线程,否则你的客户端将等待响应,你也会浪费一个本来可以用来处理另一个请求的线程。
您应该做的是使用OrderedMemoryAwareThreadPoolExecutore将您的工作分派到另一个线程池;或者你可以在messageReceived()
中使用你自己的执行者来完成它。
答案 2 :(得分:0)
我认为假设相同的线程将不用于同一客户端是唯一安全的。