npm 包 node-ipc 使用教程

阅读时长 9 分钟读完

介绍

node-ipc 是一个用于建立 Node.js 进程间通信的 npm 包。该包可以在本地或者网络上进行通信,支持多进程通讯,同时实现了诸多高级功能,例如进程间互斥锁、事件监听、广播等。

安装

你可以通过 npm 或者 yarn 进行安装:

示例

我们通过一个简单的示例来演示如何使用 node-ipc 进行进程间通信。

服务端

在服务端,我们需要引用 node-ipc 包并创建调用接口:

-- -------------------- ---- -------
----- --- - --------------------
 
------------- - --------
---------------- - -----
--------------------- - --
----------------- - -----
 
----------
  ---------- -
    --------------
      ----------
      -------------- ------- -
        ----------------------- ---------- ------ ---- ---------
      -
    --
  -
--

-------------------

在上面的代码中,我们首先使用 require 引用了 node-ipc 包。然后,我们配置了 node-ipc 的一些参数,例如 idretrymaxRetriessilent 等,这些参数与 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

纠错
反馈