Vert.x部署standard verticle线程池配置及executeBlocking相关问题
Vert.x Standard Verticle线程池相关问题解答
部署standard verticle时是否需要手动传入thread pool size参数?
不需要。
- Vert.x的线程池是Vert.x实例级别的共享资源,并不会和单个verticle绑定。Vert.x启动初始化阶段就会默认创建好两套核心线程池,部署standard verticle时不需要单独传入线程池大小参数:
- Event Loop线程池:默认大小为
2 * 服务器CPU物理核心数,专门负责执行standard verticle的非阻塞事件回调逻辑 - 全局通用Worker线程池:默认大小为20,是默认承载所有阻塞任务的公共线程池
- Event Loop线程池:默认大小为
- 只有当你需要给特定Worker Verticle配置隔离的专属线程池、不使用全局默认Worker池时,才需要在部署配置项中传入自定义线程池大小参数,这个配置对standard verticle既不是必填项,常规业务场景下也完全不需要配置。
未配置线程池参数时,standard verticle为什么能正常调用executeBlocking()?
核心原因是:executeBlocking()方法的执行线程资源,本来就不依赖部署verticle时传入的自定义线程池参数。
- 你在standard verticle中调用默认的
executeBlocking()方法时,Vert.x会直接将提交的阻塞任务调度到启动时就初始化完成的全局通用Worker线程池中排队执行,任务执行完成后,再将结果回调逻辑切回当前verticle绑定的Event Loop线程执行。整个流程完全复用Vert.x实例启动时就准备好的默认线程池资源,自然不需要你在部署verticle阶段额外传入线程池参数。
如果你觉得默认Worker池的大小不符合业务需求,不需要在部署verticle时调整,直接在Vert.x初始化阶段通过
VertxOptions的setWorkerPoolSize方法修改全局Worker池大小即可;如果有任务隔离需求,也可以提前创建具名专属Worker池,调用executeBlocking()时传入指定的池实例就能让任务跑在专属线程上,这些配置都和部署standard verticle时传不传线程池参数没有关联。
内容的提问来源于stack exchange,提问作者Uday Solanki
相关产品推荐
相关产品推荐

