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

你能在单个vert. x上运行一个垂直的并发实例吗?这些实例是线程安全的吗?

朱自明
2023-03-14

我知道这个问题已经有人问过了,但我认为它没有得到确切的答案。

Vert.x可以在单个Vert.x上运行同一vertice的多个实例吗,这意味着单个vertice可以在多个事件循环上运行吗?如果是这样的话,每个事件循环运行的是同一个处理程序实例还是一个单独的实例,换句话说,同一个垂直的多个实例是线程安全的,不共享任何状态,还是会有并发问题?

根据Vert。x文件-

即使Vertx实例维护多个事件循环,但任何特定的处理程序都不会并发执行,并且在大多数情况下(除了工作者垂直)将始终使用完全相同的事件循环调用。

很难说它们到底是什么意思。

我试图找出Actor model和Vert.x在并发性和线程映射方面的比较。到目前为止,Vert.x似乎像Actors一样工作,其中Verticle是分配给单个线程的Actors包,潜在的唯一区别是,在Vert.x中,一位代码可以同时在其他地方运行(在同一个Vert.x上),尽管可能是一个具有自己状态的独立实例,而Actors是严格禁止的,除非你将Actor复制为一个独立的类,然后它是相同的。

共有1个答案

燕英奕
2023-03-14

是的,vertx可以运行同一垂直层的多个实例。

创建vertx实例时,它将创建一些事件循环线程。默认情况下,它是机器上CPU数量的2倍。

所有部署的顶点都将多路复用到这些线程上。您可以在4个事件循环线程上拥有100个顶点。

但是一旦一个顶点被分配了一个线程,它将总是从那个事件循环线程执行。

如果您在某个地方有一个非原子/线程安全的全局变量,并且您在多个事件循环上有顶点-从多个顶点同时访问该变量是不安全的。但是在顶点内,除非您启动自己的不同线程,否则一切都是线程安全的。

然而,无论如何,这不是应该处理的方式。应用应建模为顶点,然后部署多个副本以利用计算机上的所有内核。

verticle中的所有东西都可以被认为是线程安全的,因为它是单线程的。

如果多个垂直点需要访问全局数据,则使用共享数据、事件总线、锁定或任何其他并发友好数据结构,如并发哈希映射。

需要理解的基本概念是,我希望我的代码作为单线程运行并且是安全的,但我希望能够使用我计算机上的所有内核。你是怎么做到的?您可以通过部署顶点的多个实例来执行此操作。每个实例都是单线程的,但由于有多个实例,它们将利用所有CPU内核。

它类似于node . js——node js是单线程的,因此为了利用机器上的所有内核,devs部署了多个进程副本。Jvm具有真正的线程,因此我们在不同的线程上部署多个副本,而不是多个JVM/进程。

就演员模型而言,垂直线可以被视为演员。你不必以这种方式建模,因为vertx是不和谐的。消息通过事件总线在它们之间传递。垂直体是扁平的,没有层次结构或监督,不像akka或erlang的演员模型,您的用例可能需要也可能不需要。

 类似资料:
  • 我知道,在vert. x中,默认的版本将在每次我们不需要在处理程序中写入线程安全时运行在相同的事件循环中。 例如,如果我有一个运行HttpServer的版本- } 可以保证,在任何时候,我的请求处理程序都会在两个事件循环上被调用两次(针对2个不同的请求)。因此,我不必在请求处理程序中处理线程安全问题。 如果我运行多个HttpServer顶点实例- 我需要注意线程安全吗?多个请求处理程序(最大值=1

  • 我们都知道查询不应该在UI线程上执行,但是,令人惊讶的是,我在官方文档中找不到有关类的线程安全性的信息。 我知道如何编写线程安全的,并且我知道默认情况下是线程安全的(它实现了内部锁定机制)。 但是,从多个线程使用的单个实例安全吗(例如,在同一对象上并行调用或?

  • 问题内容: https://github.com/xetorthio/jedis/wiki/入门 在多线程环境中使用Jedis 您不应该使用来自不同线程的相同实例,因为您会遇到奇怪的错误。有时创建大量的Jedis实例还不够好,因为这意味着大量的套接字和连接,这也会导致奇怪的错误。 单个Jedis实例不是线程安全的 !为避免这些问题,应使用JedisPool,它是网络连接的线程安全池。给定完成后将J

  • 静态编程语言单例(更具体地说,对象声明)在结构上是线程安全的吗?如果不是,用静态编程语言编写线程安全单例的最佳实践是什么? 我想是的,但我在文件中找不到任何明确的声明。

  • 此">答案提供了对IntStream进行分区的实现: 但是它的编辑提到这个实现不是线程安全的。然而,据我所知,收集器创建了一个单独的

  • 根据我的理解,每个Vert.x实例都将被分配一个事件循环。事件循环处理该特定实例的所有请求和其他任务。事件循环是一个线程,我认为。当部署了多个Vert.x实例时,每个实例都有自己的事件循环,对吗?这意味着存在多个线程(multi-threading)。我就是这么理解的。这个单线程概念让我非常头疼。任何帮助都将不胜感激。