Vert.x по-прежнему блокирует EventL oop, даже когда блокирующий код выполняется в executeBlocking - PullRequest
0 голосов
/ 25 мая 2020

У меня есть код:

public static void main(String[] args) {
    Vertx.vertx().deployVerticle("com.my.domain.app.Server"); //Server.java
}
public void start() {
    Router router = Router.router(vertx);
    router.route("/hello").handler(event -> {
        vertx.executeBlocking(onDone -> {
            try {
                Thread.sleep(5000); //long operation
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            onDone.complete();
        }, onDone -> {
            event.response().end();
        });
    });
    vertx.createHttpServer()
            .requestHandler(router)
            .listen(8080);
}

Затем я запускаю 8 вкладок в браузере и звоню: localhost:8080/hello. Первые 4 вкладки были закрыты после 5se c. (поскольку поток спал), еще 4 после 10 se c.

Таким образом, каждый (из 4) EventLoop блокируется до завершения задания sh. Зачем? Я использую код в методе executeBlocking.

РЕДАКТИРОВАТЬ:

РЕШЕНИЕ: Я нашел ответ. Ответ:

router.route("/hello").blockingHandler(event -> {...

Пример в Vert.x: https://github.com/vert-x3/vertx-examples/blob/master/web-examples/src/main/java/io/vertx/example/web/blockinghandler/Server.java

1 Ответ

0 голосов
/ 01 июня 2020

Полагаю, эффект, который вы получаете (в исходном коде), связан с установленным по умолчанию упорядоченным режимом выполнения блокирующих задач.

Если вы используете другой метод executeBlocking с упорядоченным параметром, установленным на false , я полагаю, вы получите параллелизм, пропорциональный размеру пула ваших рабочих потоков - что тебе нужно.

Используя executeBlocking без упорядоченного параметра, вы неявно упорядочили установку на true . Итак, каждое событие l oop thread будет (я полагаю) обрабатывать вызовы в одном контексте, который будет привязан (из-за упорядочения) к одному рабочему потоку. Таким образом, вы получите эффективно 4 одновременных выполнения блокирующих задач - то, что вы заметили. Другой рабочий поток не используется.

...