2 个版本
0.1.1 | 2021 年 7 月 28 日 |
---|---|
0.1.0 | 2021 年 7 月 28 日 |
#1124 在 WebAssembly
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
目录并执行以下操作
- 安装 wasm-pack
- 安装 deno 用于静态文件 HTTP 服务器,请参阅 file-server-deno.ts 1
- 运行
wasm-pack build --target web --out-name index
- 运行
deno run --allow-run --allow-net --allow-read ../file-server-deno.ts simple
- 导航到
https://127.0.0.1:8000
- 打开 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