我正在使用DefaultEventExecutorGroup
来执行业务处理程序方法。我的理解是,IO事件循环线程会将事件排入DefaultEventExecutorGroup
以便执行。来自DefaultEventExecutorGroup
的任何线程都将轮询这些事件,并在发生此类事件时执行处理程序方法。如果是,则DefaultEventExecutorGroup
的不同线程可以执行相同的通道处理程序方法。因此,我需要同步channelRead()
write()
方法。这是真的吗?或者是,始终只有来自DefaultEventExecutorGroup
的线程中的一个将始终执行处理程序方法,就像IO事件循环线程中的一个总是处理通道操作一样,即通道处理程序始终仅绑定到单个相同的线程,即使管道中有多个事件执行者组?
答案 0 :(得分:1)
通过Netty 4发布指南,我看到了自4.0发布以来引入的线程模型的一些信息。根据我对它的理解,下面是我的观点:
来自DefaultEventExecutorGroup的不同线程可以执行相同的操作 渠道处理方法。
将线程分配给处理程序后,此线程处理程序链接将继续,直到取消注册。处理程序方法将始终由同一个线程调用。
通道处理程序始终只绑定到同一个线程,即使是 管道中有多个事件执行器组?
如果同一管道中的两个处理程序分配了不同的EventExecutors,则会同时调用它们。如果多个处理程序访问共享数据,则用户必须注意线程安全,即使共享数据仅由同一管道中的处理程序访问。
为了测试这种情况,我尝试了NettyServer
two handlers
,每个DefaultEventExecutorGroup
都有自己的EventLoopGroup group = new NioEventLoopGroup();
try {
ServerBootstrap b = new ServerBootstrap();
b.group(group).channel(NioServerSocketChannel.class).localAddress(new InetSocketAddress(port))
.childHandler(new ChannelInitializer<SocketChannel>() {
@Override
public void initChannel(SocketChannel ch) throws Exception {
ch.pipeline().addLast(new DefaultEventExecutorGroup(10), new EchoServerHandler("Hello"));
ch.pipeline().addLast(new DefaultEventExecutorGroup(10), new EchoServerHandler(" WORLD !!!"));
}
});
。这些处理程序逐字符地写入和刷新底层通道,延迟为100 ms。第一个处理程序写入&#34; Hello&#34;第二个做一个&#34; WORLD !!!&#34;。
服务器代码:
for(int i = 0; i < message.length(); i++) {
ctx.write(Unpooled.copiedBuffer(new byte[] {message.getBytes()[i]}));
ctx.flush();
try {
Thread.sleep(100);
} catch (InterruptedException e) {}
服务器处理程序代码:
HeWlOlRoLD !!!
在客户端,一旦建立连接,我看到输出像H eWlORlLoD !!!
,Well-defined thread model
等混乱。我相信这是你要问的情景。
有关详情,请参阅以下链接中有关Netty 4.0 threading model的Write Ordering - Mix EventLoop thread and other threads
和Var
wrd, sentence : string;
begin
wrd := inputbox('Word input', ' Enter any word to build a sentence (press "xxx" to stop)','');
redOut.Clear;
while (wrd <> 'xxx') do
begin
sentence := sentence + wrd + ' ';
wrd := inputbox('Word input', ' Enter any word to build a sentence (press"xxx" to stop)','');
end;
redOut.Lines.Add(sentence);
部分。