当前位置: 首页 > 知识库问答 >
问题:

Vertx线程模型

夏侯衡
2023-03-14

我有两个问题与Vertx线程模型有关。文件提到:

  • 一个顶点。默认情况下,x实例维护N个事件循环线程(其中N默认为core*2)
  • 对于许多现代应用程序所需的并发级别,阻塞方法无法扩展

Vertx还提供了线程池相关的功能,以处理使用服务器资源的任务,这些资源需要长时间的事件处理(工作线程)。

好的,所以我们知道线程在所需内存(例如堆栈)和上下文切换方面有开销。

Vertx线程没有被阻塞(如果正确使用),但是如果我们得到的事件循环比内核多(并且工作线程也有线程池),那么上下文切换不是不可避免的吗?

第二个问题——考虑到线程切换/调度是在操作系统级别完成的,我想了解vert如何确保单个线程为事件循环运行。我在本文件中指出:

事件循环上下文在事件循环上执行处理程序:因此,处理程序直接在IO线程上执行:

  • 一个处理程序将始终使用相同的线程执行
  • 处理程序绝不能阻塞线程,否则它将为与该事件循环相关的所有IO任务造成饥饿。

有谁能澄清一下“处理程序是直接在IO线程上执行的”

共有1个答案

谢裕
2023-03-14

对于第一个问题,上下文切换是不可避免的。目标是最小化它们,而不是消除它们。事件循环和工作进程的默认数量是。。。默认值。请注意,拥有8个事件循环并不意味着它们都将被使用。如果部署一个标准Verticle的单个实例,则只有一个实例处于繁忙状态。

对于第二个问题,这意味着事件循环线程处理Netty(socket)IO事件(Vert.x对开发人员隐藏)以及Vert。x(连接、请求)事件。实际上,当收到HTTP请求缓冲区时,事件会经过Netty和Vert。x到您的应用程序代码。如果阻止线程,则无法处理以下事件。

 类似资料:
  • 我在健康检查中使用ClusterHealthCheck过程,并且在日志中看到Vertx Thread被阻止的异常。我需要将健康检查作为阻塞代码执行吗? 下面是我用来创建健康检查的代码, 低于例外 我查看了ClusterHealthCheck类,它看起来很简单,从集群管理器获取分区服务并获取集群状态,但不确定为什么需要5秒钟以上才能完成。 我使用的是vertx 4.0.3、hazelcast 4.0

  • 我是vert的新手。x、 我在尝试垂直。x“NetServer”功能。http://vertx.io/core_manual_java.html#writing-tcp服务器和客户端,它的工作方式很有魅力。 然而,我也读到“verticle实例严格来说是单线程的。 如果您创建一个简单的TCP服务器并部署它的单个实例,那么该服务器的所有处理程序始终在同一个事件循环(线程)上执行。” 目前,对于我的实

  • 在Vertx官方文件中,我阅读了以下段落 在关于Reactor的文章中: 据我所知,如果我写错了,请纠正我,Vertx的工作方式如下: 当我们为阻塞代码提供一个处理程序时,vertx将线程池中的一个线程(不是事件循环)放入该代码中,该线程等于内核数,例如我有4个内核,事件循环检查每次迭代后该线程的状态,如果它准备好执行与该阻塞代码相关的处理程序,当所有4个内核都忙时,vertx将任务放入队列,稍后

  • pika使用的是多线程模型,使用多个工作线程来进行读写操作,由底层blackwidow引擎来保证线程安全,线程分为12种: PikaServer:主线程 DispatchThread:监听1个端口,接收用户连接请求 WorkerThread:存在多个(用户配置),每个线程里有若干个用户客户端的连接,负责接收用户命令,然后将命令封装成一个Task扔到ThreadPool执行,任务执行完毕之后由该线程

  • 问题内容: Vert.x是用于在JVM上构建响应式应用程序的工具包。 我想对基于JVM的自动可伸缩RESTful后端API使用vertx。 到目前为止,我从文档中发现,默认情况下,它需要计算机中的内核数,假设您有N个内核并为每个内核创建N个线程,每个线程是一个事件总线,每个线程包含vertx实例。问题是,Vertx如何控制实例数量?基于负载压力? 关于控制通过给定线程运行的Verticles数量的

  • 维特。x是在JVM上构建反应式应用程序的工具包。 我想将vertx用于基于JVM的自动可伸缩RESTful后端API。 到目前为止,我从留档中发现,默认情况下,它需要机器中的内核数量,假设您有N个内核,并为每个内核创建N个线程,每个线程是一个事件总线,每个线程包含vertx实例。问题是,Vertx如何控制实例数量?基于负载压力? 关于控制在给定线程中运行的垂直线的数量,我仍然不明白。请帮我弄清楚这