npm 包 vacuumlabs-threading 使用教程

阅读时长 10 分钟读完

简介

vacuumlabs-threading 是一个 npm 包,它提供了一种简单易用的方式来在浏览器中执行并行任务。它支持多种并发模式,并提供了一些有用的工具,例如线程的调度和结果的聚合。

安装

你可以使用 npm 或者 yarn 来安装 vacuumlabs-threading

或者

基础用法

创建 worker

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

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

createWorker 函数接收一个字符串参数,其中包含了 worker 中要执行的 JavaScript 代码。代码中需要自己处理 message 事件,并将计算结果使用 postMessage 方法返回给主线程。

发送消息

向 worker 发送消息的方式与向普通的浏览器线程发送消息是一样的。

接收消息

worker 的返回结果通过监听 message 事件来获取。

终止 worker

在使用完 worker 后,需要手动终止它以释放资源。

高级用法

并发模式

默认情况下,vacuumlabs-threading 使用的是共享 worker。这意味着,在创建 worker 时,它会在所有调用 createWorker 函数的地方共享同一个 worker 线程。

如果你想要向 worker 中传递复杂的数据类型(例如,ArrayBuffer、SharedArrayBuffer、ImageData 等),或者需要在 worker 中加载外部资源(例如,使用 $http 模块加载 JSON 数据),那么共享 worker 就无法满足你的需求了。

在这种情况下,你可以使用"专属 worker"或"虚拟 worker"。

  • 专属 worker:每次调用 createWorker 函数时,都会创建一个新的 worker 线程。这种模式适用于需要处理大量数据或者需要在 worker 中加载外部资源的情况。

  • 虚拟 worker:在同一个页面中模拟多线程执行。这种模式适用于一些简单的并行操作,例如对一个数组中的所有元素进行处理。

线程调度

在使用一些并发模式(例如内部 worker)时,线程调度变得尤为重要。为了更好地控制线程的执行顺序,vacuumlabs-threading 提供了一些有用的工具。

  • 构建任务队列

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

    通过任务队列,你可以确保在所有任务结束之前不会开始新的任务。

  • 并发线程

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

    通过并发线程,你可以并行执行多个 worker,以最大限度地利用 CPU 的能力。

结果聚合

在使用多个 worker 同时处理数据时,有时需要对处理的结果进行聚合。为了解决这个问题,vacuumlabs-threading 提供了 Promise.all 的替代方案,即 Promise.allSettledWithProgress

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

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

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

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

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

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

PromiseAllSettled 函数接收一个 Promise 数组,它会对所有 Promise 对象并行执行,并返回一个结果数组,其中包含了它们的状态信息。它与 Promise.allSettled 类似,但是在处理被拒绝的 Promise 时,它将返回一个代表错误信息的对象,而不是抛出错误。

示例代码

使用共享 Worker

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

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

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

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

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

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

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

使用虚拟 Worker

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

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

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

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

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

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

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

使用任务队列

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

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

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

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

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

使用并发线程

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

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

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

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

-----------

总结

vacuumlabs-threading 是一个非常实用的 npm 包,它提供了一种简单易用的方式来在浏览器中执行并行任务。它支持多种并发模式,并提供了一些有用的工具,例如线程的调度和结果的聚合。希望这篇文章对你有帮助!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6005694781e8991b448e4c7d

纠错
反馈