Я пытаюсь использовать Vertx для реализации TCP-сервера, принимая входящие соединения, а затем обрабатывая разные сокеты. Поскольку каждый сокет можно обрабатывать независимо, обработчики, принадлежащие разным сокетам, должны выполняться в разных потоках цикла событий одновременно.Как отправлять входящие обработчики NetSocket в разные потоки цикла событий?
Согласно Vert.x document,
Стандартным verticles назначаются в потоке событий цикла, когда они созданы, и способ запуска вызываются с этим циклом событий. Когда вы вызываете любые другие методы, которые берут обработчик в базовом API из цикла событий, Vert.x гарантирует, что эти обработчики при вызове будут выполняться в одном цикле событий.
Я думаю, этот фрагмент кода может напечатать различные имена потоков:
Vertx vertx = Vertx.vertx(); // The number of event loop threads is 2*core.
vertx.createNetServer().connectHandler(socket -> {
vertx.deployVerticle(new AbstractVerticle() {
@Override
public void start() throws Exception {
socket.handler(buffer -> {
log.trace(socket.toString() + ": Socket Message");
socket.close();
});
}
});
}).listen(port);
Но, к сожалению, все обработчики были расположены в одной и той же теме.
23:59:42.359 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.364 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.365 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.366 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.367 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.368 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.369 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
23:59:42.370 [vert.x-eventloop-thread-1] TRACE Server - [email protected]: Socket Message
... more than 100+ lines ...
Обратный пример аналогичен this echo server written in BOOST.ASIO. Обработчики выполняются в разных потоках цикла событий, если пул потоков используется для выполнения io_service::run()
.
Итак, мой вопрос заключается в том, как запускать эти обработчики одновременно?
Я еще не понял. Разница между вашим кодом и моим - это местоположение для развертывания вертикальных рабочих элементов. Вы развертываете их снаружи, а я их развертываю в обработчике. Означает ли это, что вертикали, развернутые в некотором обработчике, наследуют поток развертывания обработчика? И что это действительно задумано, если да? –
Вы создаете вертицы для каждого запроса. Вы не должны этого делать. Вертикаль не наследует нить. Если вы запустите мой пример, вы увидите, что, хотя я создаю вертикулы так же, как и вы, я получаю разные потоки каждый раз. Причина, по которой вы думаете, что вы в одном потоке, вероятно, связана с вашим клиентом Net. Но это еще одна тема. –
Почему это не должно быть? Какая разница? Я не могу найти его в документах vert.x или, возможно, мне нужно прочитать его реализацию. :) –