【问题标题】:How to execute long blocking operations in vert.x?如何在 vert.x 中执行长阻塞操作?
【发布时间】:2019-02-22 07:57:58
【问题描述】:

Vext.x Core Manual 建议使用executeBlocking() 执行阻塞代码,以防止事件循环被阻塞。尽管如此,它也指出:

阻塞代码 [executeBlocking] 应该阻塞一段合理的时间(即不超过几秒钟)。长阻塞操作......被排除在外。当阻塞操作持续超过 10 秒时,将在控制台上打印一条消息 [...]。 长阻塞操作应使用由应用程序管理的专用线程,该线程可以使用事件总线或 runOnContext 与 Verticle 交互

所以我无法在executeBlocking 中执行长阻塞操作。

为了说明这一点,例如,我正在阅读等待无限数据流,例如按下键盘键。每次新数据到达(按下一个键)时,我都想向事件总线发送一个事件。

while(keyboard.hasNextByte()) { // loops forever
  eventBus.publish("keyboard.keypress", keyboard.nextByte());
}

据我了解,创建自己的线程会破坏 Vert.x 的设计。那么如何在不使用executeBlocking的情况下执行这样无限期阻塞的代码呢?

【问题讨论】:

  • 我将while(true){} 操作放在另一个进程中(垂直?),这样它就可以通过事件总线发送一些东西,同时永远运行而不会阻塞
  • @injecteer 将循环移动到另一个顶点不会阻止它阻塞事件总线线程。我理解你的意思吗?

标签: vert.x


【解决方案1】:

我认为创建一个“由应用程序管理”的单独线程的想法确实没有问题。 在你的情况下,这个线程会很简单,基本上,在应用程序启动时启动它,就是这样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-14
    • 1970-01-01
    相关资源
    最近更新 更多