【问题标题】:How vert.x is single threaded?vert.x 有多单线程?
【发布时间】:2014-07-18 19:59:29
【问题描述】:

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

【问题讨论】:

  • 多个事件循环意味着没有多线程?
  • 当你说“vert.x instance”时,你的意思是“verticle instance”吗?

标签: java multithreading vert.x single-threaded singlethreadmodel


【解决方案1】:

Vert.x 不像 node.js 那样是单线程的。 在 vert.x 中,您必须区分 Verticles 和 WorkerVerticles。一个 Vert.x 实例将创建多个事件循环(它们是线程),通常每个 CPU 核心一个。 Verticles 将被分配给一个事件循环,并且总是由同一个线程执行,但前提是有工作要做。 WorkerVerticles 将被分配给来自工作池的线程,并且可以由不同的线程执行。 Vert.x 编程之所以有趣,是因为您可以“假装”它是单线程的。您不必关心并发性,因为您无法在 Verticle 之间共享变量。每个 Verticle 在自己的类加载器中运行,您只能通过事件总线共享数据。 (还有一个共享地图,但在这种情况下会分散注意力。)

【讨论】:

  • “Verticles 将被分配给一个事件循环,并且总是由同一个线程执行,但前提是有工作要做”。这听起来真的很糟糕。这意味着您可以在同一线程上有两个繁忙的垂直线互相阻塞,而其他线程则处于空闲状态。 Golang 正确地做到了——准备好的 goroutine 总是分配给下一个可用的线程。
  • 对于一个简单的 REST 服务器,我的猜测是您不希望使用工作节点进行 db 调用,然后通过 eventBus 发送数据,因为这太昂贵了。我假设使用io.vertx.ext.web.Router 处理主垂直中的请求是最好的。但我不知道 MainVerticle 代码是否总是运行同一个线程——我猜是这样。
【解决方案2】:

您现在可能已经想通了,但我正在为可能遇到此问题的其他人发布答案。

一个 vert.x 实例 将创建多个线程。在该 vert.x 实例 中,您有多个 verticles(更准确地说是verticle 实例)正在运行。 它是一个 verticle 实例,它分配了一个 event loop,但该 event loop 并不是专门分配给该 Verticle。

当您运行的 Verticle 数量超过线程数时,可能会发生重叠。在这种情况下,一些 Verticle 将被分配给与其他 Verticle 相同的事件循环。该事件循环将处理来自所有分配的 Verticle 的事件。

但是,一旦一个 Verticle 实例被启动并分配给一个事件循环/线程,它将在其上运行,直到该 Verticle 被终止。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 2019-01-13
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    相关资源
    最近更新 更多