【发布时间】: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