首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >vertx如何创建eventloop线程

vertx如何创建eventloop线程
EN

Stack Overflow用户
提问于 2020-08-18 18:29:12
回答 1查看 134关注 0票数 0

我尝试过DeploymentOptions.setEventLoopPoolSize(even number x),但它实际上创建了x/2个线程,奇数也可以。

代码很简单,如下:

代码语言:javascript
复制
public final class Bootstrap {

    private static final VertxOptions VERTX_OPTIONS;
    private static final Vertx VERTX;

    private static final DeploymentOptions HTTP_SERVER_DEPLOYMENT_OPTIONS;

    static {
        VERTX_OPTIONS = new VertxOptions();
        VERTX_OPTIONS.setEventLoopPoolSize(22);
        System.out.println("Event Loop Pool Size: " + VERTX_OPTIONS.getEventLoopPoolSize());

        VERTX = Vertx.vertx(VERTX_OPTIONS);

        HTTP_SERVER_DEPLOYMENT_OPTIONS = new DeploymentOptions();
        HTTP_SERVER_DEPLOYMENT_OPTIONS.setInstances(24);
        HTTP_SERVER_DEPLOYMENT_OPTIONS.setWorkerPoolName("http-server-worker");//remove this line you can create the right number of thread
    }

    public static void main(String[] args) {
        VERTX.deployVerticle(MyHttpServer.class, HTTP_SERVER_DEPLOYMENT_OPTIONS, ar -> {
            System.out.println("success");
            System.out.println("is Worker? " + HTTP_SERVER_DEPLOYMENT_OPTIONS.isWorker());
        });
    }
}

public class MyHttpServer extends AbstractVerticle {

    @Override
    public void start(Promise<Void> startPromise) throws Exception {

        Router router = Router.router(vertx);
        String content = "I'm " + this + " thread: " + Thread.currentThread() + " router: " + router;

        router.get("/").handler(context -> {
            context.response().end(content);
        });

        vertx.createHttpServer().requestHandler(router).listen(80, ar -> {
            if(ar.succeeded()) {
                System.out.println("server start " + this);
                startPromise.complete();
            } else {
                ar.cause().printStackTrace();
            }
        });
    }
}

wertx-web 3.9.2

打开Java VisualVM时,您可以看到设置和不设置WorkerPoolName之间的区别。设置为Java visualVM image时,如果EventLoopPoolSize为偶数,则实际创建的线程数将减半。setWorkerPoolName()怎么了?

EN

回答 1

Stack Overflow用户

发布于 2020-08-19 01:22:18

我阅读了源代码,发现该方法

代码语言:javascript
复制
private static EventLoop getEventLoop(VertxInternal vertx) in io.vertx.core.impl.ContextImpl

有一个有趣的行为:无论谁调用这个方法,它都会在io.netty.util.concurrent.DefaultEventExecutorChooserFactory.GenericEventExecutorChooser,中实际实现一个内部类之后,从一个数组中给出一个EventLoop对象,它有一个方法another.It ()

代码语言:javascript
复制
    @Override
    public EventExecutor next() {
        return executors[Math.abs(idx.getAndIncrement() % executors.length)];
    }

因此,当您为EventLoop创建一个线程,并准确地获取所有对应于偶数(或奇数)索引的所有EventLoops时,EventLoop数组的一半将丢失。

而且,当vertx部署verticle时,它会查看你是否setWorkerPoolName:

代码语言:javascript
复制
for (Verticle verticle: verticles) {
  WorkerExecutorInternal workerExec = poolName != null ? vertx.createSharedWorkerExecutor(poolName, options.getWorkerPoolSize(), options.getMaxWorkerExecuteTime(), options.getMaxWorkerExecuteTimeUnit()) : null;
  WorkerPool pool = workerExec != null ? workerExec.getPool() : null;
  ContextImpl context = (ContextImpl) (options.isWorker() ? vertx.createWorkerContext(options.isMultiThreaded(), deploymentID, pool, conf, tccl) :
    vertx.createEventLoopContext(deploymentID, pool, conf, tccl));

如果您这样做了,它将为此步骤创建2个上下文。这意味着它将调用两次getEventLoop()方法来获取每个上下文的EventLoop。总而言之,如果您设置了poolName,则每个Verticle在部署时将获得两次EventLoop,但只会创建一个线程。

我不知道这是不是一个bug,因为我刚和vertx联系了两天,我不知道这是否是故意设计的,我只想通过setEventLoopPoolSize()方法来控制我的线程数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63466734

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档