在Vertx官方文档中,我阅读了以下段落
If a result can be provided immediately, it will be returned immediately, otherwise you will usually provide a handler to receive events some time later.
Because none of the Vert.x APIs block threads that means you can use Vert.x to handle a lot of concurrency using just a small number of threads.
关于Reactor的文章:
Vert.x works differently here. Instead of a single event loop, each Vertx instance maintains several event loops. By default we choose the number based on the number of available cores on the machine, but this can be overridden.
据我了解,如果我写错了,请纠正我,Vertx的工作方式如下:
当我们提供一个阻塞代码的处理程序时,vertx将一个线程(不是事件循环)从线程池中放入此代码,该代码等于核心数,例如我有4个核心,并且事件循环检查该线程的状态每次迭代后 如果它准备好执行与此阻塞代码相关的处理程序,当所有4个核都忙时,将vertx任务放入队列以便稍后执行,
工作者Verticle怎么样,我们有另一个默认情况下等于20的线程池,当我们使用以下方法时:vertx.executeBlocking()
我们使用来自这个池的线程。
我的理解是否正确?
(PS) 根据下面的asnwer,使用处理程序阻止代码和使用处理程序阻止代码但使用执行阻塞
之间没有区别//jdbc
connection.execute("insert into test values (1, 'Hello'), (2, 'World')", insert -> {
// query some data with arguments
connection.queryWithParams("select * from test where id = ?", new JsonArray().add(2), rs -> {
if (rs.failed()) {
System.err.println("Cannot retrieve the data from the database");
rs.cause().printStackTrace();
return;
}
}
//工作线程
vertx.executeBlocking(e->{},handler->{});
我的理解是否正确,两个代码都使用工作线程?
答案 0 :(得分:2)
Vert.x维护两个线程池。
一个使用事件循环线程。默认情况下,每个核心有两个事件循环线程。在4核机器上,您将拥有8个事件循环线程。每个非阻塞代码都在事件循环上运行。如果部署多个Verticle,它们通常均匀分布在事件循环线程上。至关重要的是代码不会阻止,否则同一事件循环上的所有其他代码都会被阻止。
另一个线程池是工作池(默认大小为20,但这是可配置的,请参阅https://vertx.io/docs/apidocs/io/vertx/core/VertxOptions.html#DEFAULT_WORKER_POOL_SIZE),这是一种“经典”线程。当您调用executeBlocking
时,该代码段将被分派到工作池的一个线程中,因此它不会阻止事件循环。
执行阻塞时,提供两个处理程序,一个执行阻塞代码,一个在工作线程上运行,另一个 - 接收结果 - 在事件循环上运行(调用者线程,如果你等)
vertx.executeBlocking(fut -> {
//blocking code, run on the worker thread
fut.complete("my result");
}, res -> {
//non blocking code running on the event loop thread
System.out.println(res.result());
});
关于您添加的问题,您在这里使用的是Vert.x JDBC客户端
在引擎盖下运行工作线程上的阻塞JDBC部分,因此您不必处理此问题。所以,是的,它基本上与在executeBlocking
语句中的第一个blockingHandler中编写自己的JDBC访问代码相同。您也可以在Vert.x JDBC客户端的代码中看到它:https://github.com/vert-x3/vertx-jdbc-client/blob/c83138c00390777f3d17ac492f09203e9e92284d/src/main/java/io/vertx/ext/jdbc/impl/actions/AbstractJDBCAction.java#L66