Vertx를 사용하여 TCP 서버를 구현하고 들어오는 연결을 수락 한 다음 다른 소켓을 처리하려고합니다. 각 소켓은 독립적으로 처리 할 수 있으므로 다른 소켓에 속한 핸들러는 서로 다른 이벤트 루프 스레드에서 동시에 실행됩니다. 만들어 질 때 Vert.x document 따르면 들어오는 NetSocket 처리기를 다른 이벤트 루프 스레드로 보내려면 어떻게해야합니까?
,표준 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 - io[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()
을 실행하는 데 사용되는 경우 다른 이벤트 루프 스레드에서 핸들러가 실행됩니다.
그럼, 내 질문은 이러한 핸들러를 동시에 실행하는 방법입니까?
아직 이해하지 못했습니다. 코드와 광산의 차이점은 작업자 verticle을 배치하는 위치입니다. 핸들러에 배포하는 동안 외부에 배포합니다. 일부 처리기에 배포 된 verticle이 처리기를 배포하는 스레드를 상속한다는 의미입니까? 그렇다면 실제로 의도 된 것은 무엇입니까? –
각 요청에 대해 verticle을 만듭니다. 너는 그렇게해서는 안된다. verticles는 스레드를 상속하지 않습니다. 당신이 나의 예제를 실행한다면 당신이하는 것처럼 똑같은 방법으로 verticle을 만들지 만 매번 다른 쓰레드를 얻는다는 것을 알 수있을 것이다. 동일한 스레드에 있다고 생각하는 이유는 아마도 Net 클라이언트를 처리하는 방법 일 것입니다. 그러나 그것은 또 다른 주제입니다. –
왜 그렇게해서는 안됩니까? 차이점이 뭐야? 내가 vert.x 문서에서 그것을 찾지 못하거나 어쩌면 그 구현을 읽어야한다. :) –