gpt4 book ai didi

java - Netty 处理程序方法是否总是从单个执行程序调用?

转载 作者:行者123 更新时间:2023-12-01 10:22:01 26 4
gpt4 key购买 nike

我正在使用 DefaultEventExecutorGroup 来执行业务处理程序方法。我的理解是,IO 事件循环线程会将事件排队到 DefaultEventExecutorGroup 中执行。来自 DefaultEventExecutorGroup 的任何线程都将轮询这些事件,并在此类事件发生时执行处理程序方法。如果是这样,那么来自 DefaultEventExecutorGroup 的不同线程可以执行相同的 channel 处理程序方法。因此,我需要同步 channelRead() write() 方法。这是真的吗?或者说,始终只有 DefaultEventExecutorGroup 中的一个线程始终执行处理程序方法,就像 IO 事件循环线程之一始终处理 channel 操作一样,即 channel 处理程序始终绑定(bind)到单个相同的方法仅线程,即使管道中有多个事件执行器组?

最佳答案

浏览 Netty 4 发行指南,我看到了一些有关自 4.0 版本以来引入的线程模型的信息。根据我的理解,我的看法如下:

different threads from DefaultEventExecutorGroup can executing same channel handler methods.

一旦将线程分配给处理程序,该线程处理程序链接将继续,直到取消注册。处理程序方法将始终由同一线程调用。

channel handler is always bound to single same thread only, even when there are multiple event executor groups in pipeline?

如果同一管道中的两个处理程序分配有不同的 EventExecutor,则它们会同时调用。如果多个处理程序访问共享数据,即使共享数据仅由同一管道中的处理程序访问,用户也必须注意线程安全。

为了测试这个场景,我尝试使用 NettyServer,它有两个处理程序,每个处理程序都有自己的 DefaultEventExecutorGroup。这些处理程序逐字符写入并刷新到底层 channel ,延迟为 100 毫秒。第一个处理程序写“Hello”,第二个处理程序写“WORLD !!!”。

服务器代码:

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 !!!"));
}
});

服务器处理程序代码:

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 !!! 等。我相信这是您所询问的场景。

请参阅以下链接中有关 Netty 4.0 threading model明确定义的线程模型写入顺序 - 混合 EventLoop 线程和其他线程 部分。了解更多信息。

关于java - Netty 处理程序方法是否总是从单个执行程序调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35533634/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com