介绍
node-ipc 是一个用于建立 Node.js 进程间通信的 npm 包。该包可以在本地或者网络上进行通信,支持多进程通讯,同时实现了诸多高级功能,例如进程间互斥锁、事件监听、广播等。
安装
你可以通过 npm 或者 yarn 进行安装:
npm install node-ipc
yarn add node-ipc
示例
我们通过一个简单的示例来演示如何使用 node-ipc 进行进程间通信。
服务端
在服务端,我们需要引用 node-ipc 包并创建调用接口:
-- -------------------- ---- ------- ----- --- - -------------------- ------------- - -------- ---------------- - ----- --------------------- - -- ----------------- - ----- ---------- ---------- - -------------- ---------- -------------- ------- - ----------------------- ---------- ------ ---- --------- - -- - -- -------------------
在上面的代码中,我们首先使用 require
引用了 node-ipc 包。然后,我们配置了 node-ipc 的一些参数,例如 id
、retry
、maxRetries
、silent
等,这些参数与 ipc.config 有关。接着,我们创建了一个 IPC 服务,监听名为 "message" 的消息,并在 IPC 通道上发出一条 "Hello from server" 的响应消息。
最后通过 ipc.server.start()
方法启动 IPC 服务端。
客户端
客户端需要引用包并连接到服务端地址:
-- -------------------- ---- ------- ----- --- - -------------------- -------------- -------- ---------- - ---------------- ---------- ---------- - ------------------ ---------- ------ ---- ------- -- - -- ---------------- ---------- -------------- - ------------------ - -- - --
在上面的代码中,我们使用 ipc.connectTo
方法连接到 IPC 服务端,并监听 connect
事件。当 connect
事件被触发时,我们使用 ipc.of.world.emit
发送消息 "Hello from client" ,并且在接收到来自服务端的 "message" 消息时打印数据到控制台。
进程间互斥锁
当多个进程存在时,我们可能希望在某个进程进行计算或操作的时候,其他进程不要对这个进程的数据或代码造成干扰。这时我们可以使用互斥锁。
-- -------------------- ---- ------- ----- --- - -------------------- ------------- - -------- ---------------- - ----- --------------------- - -- ----------------- - ----- ---------- ---------- - -------------- ---------- -------------- ------- - ---------------- ------- ----------- ------------------------ ------- ------- ------ ---------- - ---------------- ------- --------------- -- - - -- - -- -------------- --------- -------------- ------- - ------------------ ------- ------- ---------- - ---------------- ------- - - -------- - - --------- ------------ -- - - ---- -------------------- ---------------- ------- --------- -- - -- - -- - -- -------------------
在上面的代码中,我们定义了监听名为 "lock.it" 的消息,该消息将请求一个互斥锁。当请求到达服务端后,服务端会通过 requestMutex
方法尝试获得一个名为 "lock" 的互斥锁,并在最多等待 10 秒后超时。如果获得了锁,服务端会发出 "lock.granted" 的消息并开始执行业务逻辑,否则服务端会发出 "lock.error" 消息表示获取锁失败。
在 "do.sth" 消息中,服务端解锁名为 "lock" 的互斥锁,以便其他进程可以获得锁并执行业务逻辑。
-- -------------------- ---- ------- ----- --- - -------------------- ------------- - --------- ---------------- - ----- --------------------- - -- ----------------- - ----- -------------- -------- ---------- - ---------------- ---------- ---------- - ------------------ --------- -- - -- ---------------- ----------- -------------- - -- ------------ --- ----- - ------------------ --------- - ---- ----------- - -- - ---- - ------------------- --- ------- -- -------- ------------------------ - - -- ---------------- --------------- ---------- - ------------- ----------- - -- ---------------- ---------- ---------- - ------------------------ - -- - --
在上面的代码中,我们通过 ipc.connectTo
方法连接 IPC 服务端,并监听 lock.ack
事件。一旦我们获得到 "lock.ack" 消息,并且包含一个 "ok" 的结果,我们会紧接着发出 "do.sth" 的消息并传递进程 ID。当业务逻辑完成时,服务端将解锁该互斥锁并发出 "did.sth" 消息,客户端随后断开连接。
广播
你可以使用 node-ipc 进行广播。广播可以用来通知所有连接进程。
-- -------------------- ---- ------- ----- --- - -------------------- ------------- - -------- ---------------- - ----- --------------------- - -- ----------------- - ----- ---------- ---------- - -------------- ---------- -------------- ------- - --------------------- -------------------- ---- -- - -- - -- -------------------
在上面的代码中,我们监听 "message" 消息,并使用 ipc.server.broadcast
方法将来自客户端的消息广播到所有连接进程的 "broadcast.message" 通道上。
-- -------------------- ---- ------- ----- --- - -------------------- ------------- - --------- ---------------- - ----- --------------------- - -- ----------------- - ----- -------------- -------- ---------- - ---------------- ---------- ---------- - ------------------ ---------- ------ ---- ------- -- - -- ---------------- -------------------- -------------- - ------------------ - -- - --
在上面的代码中,我们在客户端连接到 IPC 服务端后,发送 "message" 类型的消息。当接收到来自服务端的 "broadcast.message" 通道上的数据时,我们打印数据到控制台。
结语
在本教程中,我们已经学习了如何使用 npm 包 node-ipc 来实现进程间通信。借助于 node-ipc,你可以轻松地实现在 Node.js 中的不同进程之间的通信,并通过互斥锁来避免数据竞争的问题,广播也会让你更灵活地通知对应的进程有新的任务。node-ipc 框架性能与稳定性相当之高,是 node 理想的解决方案之一。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60828