当前位置:   iOS > 正文

为什么我们真的需要多个netty老板线程?

netty,服务器,bootstrap,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发工具,前端开发工具,开发人员工具,站长工具

我真的很困惑老板组的线程数。我无法弄清楚我们需要多个老板线程的情况。在做,我们需要更多的比老板组单线程?Netty的创建者说,如果我们在不同的服务器引导程序之间共享NioEventLoopGroup,则多个老板线程很有用,但我不知道这样做的原因。

考虑以下简单的Echo服务器:

public class EchoServer {

private final int port;
private List channelFutures = new ArrayList(2);

public EchoServer(int port) {
    this.port = port;
}

public void start() throws Exception {

    EventLoopGroup bossGroup = new NioEventLoopGroup(1);
    EventLoopGroup workerGroup = new NioEventLoopGroup(4);

    for (int i = 0; i != 2; ++i) {
        ServerBootstrap b = new ServerBootstrap();
        b.group(bossGroup, workerGroup)
                .channel(NioServerSocketChannel.class) // the channel type
                .childHandler(new ChannelInitializer() {
                    @Override
                    public void initChannel(SocketChannel ch)
                            throws Exception {
                        System.out.println("Connection accepted by server");
                        ch.pipeline().addLast(
                                new EchoServerHandler());
                    }
                });

        // wait till binding to port completes
        ChannelFuture f = b.bind(port + i).sync();
        channelFutures.add(f);
        System.out.println("Echo server started and listen on " + f.channel().localAddress());
    }

    for (ChannelFuture f : channelFutures)
        f.channel().closeFuture().sync();

    // close gracefully
    workerGroup.shutdownGracefully().sync();
    bossGroup.shutdownGracefully().sync();
}

public static void main(String[] args) throws Exception {
    if (args.length != 1) {
        System.err.println(
                "Usage: " + EchoServer.class.getSimpleName() +
                        " ");
        return;
    }
    int port = Integer.parseInt(args[0]);
    new EchoServer(port).start();
}

在上面的示例中,我创建了一个具有1个线程的bossGroup和具有4个线程的workerGroup,并将这两个事件组共享到绑定到两个不同端口(例如9000和9001)的两个不同的引导程序。以下是我的处理程序:

@ChannelHandler.Sharable
public class EchoServerHandler extends ChannelInboundHandlerAdapter {

@Override
public void channelRead(ChannelHandlerContext ctx,
                        Object msg)  throws Exception  {
    ByteBuf in = (ByteBuf) msg;
    System.out.println("Server received: " + in.toString(CharsetUtil.UTF_8) + " from channel " + ctx.channel().hashCode());
    ctx.write(in);
}

@Override
public void channelReadComplete(ChannelHandlerContext ctx) {
    System.out.println("Read complete for channel " + ctx.channel().hashCode());
    // keep channel busy forever
    while(true); 
}

@Override
public void exceptionCaught(ChannelHandlerContext ctx,
                            Throwable cause) {
    cause.printStackTrace();
    ctx.close();
}
}

在上面的处理程序中,我故意通过while(true)来保持频道繁忙;现在,如果我使用参数9000启动我的应用程序,它将创建两个在端口9000和9001上绑定的服务器引导程序。

Echo server started and listen on /0:0:0:0:0:0:0:0:9090
Echo server started and listen on /0:0:0:0:0:0:0:0:9091

现在,如果我同时连接到两个端口并开始发送数据,则可以接收的最大连接数为4,这是有道理的,因为我创建了4个工作线程并保持它们的通道忙而不关闭它:

echo 'abc' > /dev/tcp/localhost/9000
echo 'def' > /dev/tcp/localhost/9000
echo 'ghi' > /dev/tcp/localhost/9001
echo 'jkl' > /dev/tcp/localhost/9000
echo 'mno' > /dev/tcp/localhost/9001 # will not get connected

您也可以:

telnet localhost 9000 -> then send data "abc"
telnet localhost 9000 -> then send data "def"
telnet localhost 9001 -> then send data "ghi"
telnet localhost 9000 -> then send data "jkl"
telnet localhost 9001 -> # will not get connected

我不明白的是,我有一个老板线程,并且能够通过两个服务器引导程序连接到两个端口。那么,为什么我们需要一个以上的老板线程(默认情况下,老板线程的数量为2 * num_logical_processors)?

谢谢,

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/blog/iOS/detail/8244
推荐阅读
  • 如何解决《为什么xvalues不绑定到非const左值引用?》经验,为你挑选了1个好方法。c++,rvalue-reference,c++11,ios,安全,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解... [详细]

  • 如何解决《如何为SwiftiOS编程配置UncrustifyforAllman风格?》经验,为你挑选了0个好方法。ios,uncrustify,swift,rust,xcode,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,... [详细]

  • 如何解决《SpringAOPCGLIB代理的字段为空》经验,为你挑选了1个好方法。java,spring,spring-aop,cglib,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码... [详细]

  • 如何解决《iOS:NSCalendarUnitWeekday的值是星期一的1》经验,为你挑选了1个好方法。objective-c,ios,https,cocoa,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,jso... [详细]

  • 如何解决《在iOS中从提供的视图控制器推送视图》经验,为你挑选了5个好方法。objective-c,uinavigationcontroller,pushviewcontroller,ios,presentviewcontroller,De... [详细]

  • 如何解决《UISlider设定值》经验,为你挑选了1个好方法。user-interface,uislider,uianimation,ios,swift,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,... [详细]

  • 如何解决《计算移动设备的实际行驶距离》经验,为你挑选了4个好方法。java,android,google-maps,objective-c,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码... [详细]

  • 如何解决《滚动视图中的动态高度TableView》经验,为你挑选了1个好方法。uitableview,uiscrollview,ios,autolayout,swift,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具... [详细]

  • 如何解决《使用Swift在iOSWKWebview中捕获Javascript事件》经验,为你挑选了2个好方法。javascript,jquery,ios,swift,swift2,DevBox,在线流程图,编程,编程问答,程序员,开发者工具... [详细]

  • 如何解决《Xamarin.Forms中的GooglePlaceAutocomplete》经验,为你挑选了0个好方法。google-maps,google-places-api,xamarin,xamarin-forms,go,android... [详细]

  • 如何解决《parse.com'转发'模式太冗长了》经验,为你挑选了0个好方法。design-patterns,ios,parse-platform,swift,程序员,DevBox,在线流程图,编程,编程问答,程序员,开发者... [详细]

  • 如何解决《创建没有物理设备的配置文件(为TestFlight测试存档)》经验,为你挑选了1个好方法。iphone,ios,provisioning-profile,testflight,xcode,DevBox,在线流程图,编程,编程问答,... [详细]

  • 如何解决《建议C++容器保存前20个最小值》经验,为你挑选了5个好方法。c++,containers,filtering,sql,容器,ios,算法,go,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析... [详细]

  • 如何解决《如何在iOS8设备上运行测试时禁用UITesting?》经验,为你挑选了2个好方法。testing,ios,xcode7,机器人,iphone,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,... [详细]

  • 如何解决《中心页脚UILabel分组UITableView-Swift》经验,为你挑选了1个好方法。text-alignment,uitableview,uilabel,ios,swift,DevBox,在线流程图,编程,编程问答,程序员,... [详细]

  • 如何解决《Cocoapodsuse_frameworks!进口问题》经验,为你挑选了2个好方法。xcode,objective-c,facebook-ios-sdk,cocoapods,swift,ios,webview,go,css,gi... [详细]

  • 如何解决《Android-尝试添加图像时会创建一个空白图像》经验,为你挑选了1个好方法。android,image,android-activity,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解... [详细]

  • 如何解决《在本地范围内重新定义typedef》经验,为你挑选了1个好方法。c++,scope,typedef,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix时间戳,在线开发... [详细]

  • 如何解决《安装eventmachine时发生错误(1.0.3)》经验,为你挑选了1个好方法。ruby,ssl,rubygems,ruby-on-rails,https,twitter,bootstrap,git,sql,mysql,css,... [详细]

  • 如何解决《为什么MemberDetector后备必须是int?》经验,为你挑选了0个好方法。c++,sfinae,https,ios,DevBox,在线流程图,编程,编程问答,程序员,开发者工具,开发工具,json解析,二维码生成,unix... [详细]

相关标签
  

闽ICP备14008679号