node.js - Node.js 中的自定义事件编程:I/O 绑定的面向事件的设计模式?
问题描述
我正在 node.js 中开发工厂自动化软件(图腾车门)。
该程序管理了一堆“任务”,例如它必须:
- 监视和控制一些 I/O 数字信号
- 管理来自外部主机的消息,比如通过 TCP 套接字消息
- 通过 HTTP REST 轮询其他设备(我需要将轮询转换为事件)
- 通过键盘(和屏幕终端/语音输出)与用户交互
- 在外部服务器上查询关系数据库
- 等等
众所周知,node.js 是管理(I/O)事件的完美环境,我知道我可以使用 EventEmitter
类生成自定义事件。
假设,对于以上详细说明的所有任务:
- 任何任务都可以以异步方式(HTTP/TCP/键盘)进行管理,
- 我能够在 Node.js 单线程(1 个 CPU 核心)中管理所有上述“任务”
因此,我可以将我的主程序设计为事件驱动,将应用程序逻辑实现为对 SW 事件(Node.js 自定义事件)的回调,并将这些事件与 I/O(HW)事件映射。
下面是一个伪代码:
// -----------------------------
// module A: keyboard management
// -----------------------------
// when user enter 5 digits (code) on the keypad keystroke (code omitted),
// emit the SW event 'digitsEntered'
keyBoardDialog.emit('digitsEntered', code)
// ----------------------------------------
// module B: I/O digital signals management
// ----------------------------------------
// poll (every ~300 msecs) through HTTP GET
// to get a buffer containing all digital input bits
// and when the digital input 1 goes ON, emit SW event, 'DI1ON' (code omitted)
digitalInputs.emit('DI1ON')
// -----------
// main module
// -----------
// all events handler
keyBoardDialog.on ('digitsEntered', (code) => doActionWithDigits(code) )
digitalInputs.on ('DI1ON', doAnotherAction() )
function doActionWithDigits(code) {
writeOnDatabase(code) // asynch
writeDigitalOutput(4) // HTTP GET = asynch
// any other synch or asynch function
}
自定义事件回调(处理程序),可以包含顺序和/或异步(异步)函数。
例如,让我们专注于从键盘读取击键的任务。用户必须输入 5 位数字,键盘模块逻辑会触发自定义事件 ( 'digitsEntered'
)。
doActionWithDigits()
处理程序包含异步函数。这里可能出现时间/数据共享问题。
因为基于事件的单线程架构,我必须在自定义 e 事件处理程序中管理某种“无中断”逻辑。避免数据 R/W 重叠。为了避免在运行等时再次触发自定义事件等。
在我看来,我正面临着经典的多线程管理噩梦。
我的问题:
- 关于如何在类似情况下管理自定义事件处理程序有什么好的做法/指南?
- 使用自定义事件而不是 Node.js 回调的真正优势是什么?这完全是一个解耦逻辑的问题?
- 你能推荐一些关于设计模式良好实践的阅读(文章/书籍)吗?
解决方案
推荐阅读
- conditional-statements - Verilog:使用三元运算符的更有效方式
- python-3.x - 在类中创建和检查可逆矩阵
- python - 如何在 python 中向多个组发送 smtplib 电子邮件?
- java - Jersey HTTP Delete,Put 响应状态:405(不允许的方法)
- python - 使用 Python 读取 CSV 并根据列条件随时间绘制 5 个系列
- python-3.x - Tableau Server 如何批量更新数据源服务器名称?
- html - IntelliJ 用标签替换文本
- c++ - c++ 数学库当域错误时会发生什么?
- flutter - 如何使用自定义字段登录 Google 帐户
- python - 类型错误:元类冲突