#rayon #js #pool #worker #combine #turn

wasmyon

另一种结合 rayon 和 wasm 的方法

2 个版本

0.1.1 2021 年 7 月 28 日
0.1.0 2021 年 7 月 28 日

#1124WebAssembly

MIT 许可证

18KB
212

wasmyon

为 wasm 和 rayon 提供实验性的“一键”解决方案。这基本上是从官方示例中复制了 pool.rs,并添加了一些内容。

要了解如何使用此库,请参阅 examples/simple/src/lib.rs。本质上,所有 rayon 调用都必须返回一个 JS Promise 才能正确工作,因此 API 是

#[wasmyon_promise]
pub fn sum_in_workers() -> i32 {
    (0..100000 as i32).into_par_iter().sum::<i32>()
}

这创建了一个 JS 包装函数

function sum_in_workers() -> Promise<any>

此外,如果您想自己运行 worker 中的内容,可以这样做

run_in_worker(|| yourstuff)

注意 目前该库假设您的应用程序是用 wasm-pack 通过 --out-name index 生成的。这是因为无法在 WASM 中获取 import.meta.url,这是 wasm-bindgen 的限制。

尝试示例

为了测试,请转到 examples/simple 目录并执行以下操作

  1. 安装 wasm-pack
  2. 安装 deno 用于静态文件 HTTP 服务器,请参阅 file-server-deno.ts 1
  3. 运行 wasm-pack build --target web --out-name index
  4. 运行 deno run --allow-run --allow-net --allow-read ../file-server-deno.ts simple
  5. 导航到 https://127.0.0.1:8000
  6. 打开 DevTools 查看控制台中的通信

它是如何工作的?

它仅初始化一个 单个 WebAssembly.Memory 对象,并在 worker 之间共享它。它还在 wasm-bindgen JS 片段中创建线程 worker。

待办事项

  • 自动可伸缩的 worker 池,以便在一段时间未使用时终止 worker...
  • TypeScript 需要处理。因为 js_sys::Promise 没有提供输出类型的类型定义方式。目前它只是 Promise<any>。要解决这个问题,可能需要对 wasm_bindgen 进行补丁。

脚注

1: 如果你不想使用 Deno,你仍然需要一个能够设置头信息 Cross-Origin-Opener-Policy: same-origin, Cross-Origin-Embedder-Policy: require-corp 的文件服务器,否则 SharedArrayBuffer 将未定义。 查看文档。

依赖项

~11MB
~199K SLoC