我尝试过DeploymentOptions.setEventLoopPoolSize(even number x),但它实际上创建了x/2个线程,奇数也可以。
代码很简单,如下:
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()怎么了?
发布于 2020-08-19 01:22:18
我阅读了源代码,发现该方法
private static EventLoop getEventLoop(VertxInternal vertx) in io.vertx.core.impl.ContextImpl有一个有趣的行为:无论谁调用这个方法,它都会在io.netty.util.concurrent.DefaultEventExecutorChooserFactory.GenericEventExecutorChooser,中实际实现一个内部类之后,从一个数组中给出一个EventLoop对象,它有一个方法another.It ()
@Override
public EventExecutor next() {
return executors[Math.abs(idx.getAndIncrement() % executors.length)];
}因此,当您为EventLoop创建一个线程,并准确地获取所有对应于偶数(或奇数)索引的所有EventLoops时,EventLoop数组的一半将丢失。
而且,当vertx部署verticle时,它会查看你是否setWorkerPoolName:
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()方法来控制我的线程数。
https://stackoverflow.com/questions/63466734
复制相似问题