#thread-pool #multi-threading #prelude #wasm-mt

nightly wasm-mt-pool

基于wasm-mt的线程池库

3个版本

0.1.2 2022年11月30日
0.1.1 2021年3月15日
0.1.0 2020年5月25日

#831WebAssembly

25 每月下载量
用于 wasm-mt-pool-test

MIT/Apache

69KB
953

wasm-mt-pool

文档 | GitHub | Crate

crates MIT licensed CI

基于 wasm-mt 的线程池库 (github | crate).

示例

您可以在浏览器中运行以下所有应用程序!

  • pool_exec - 如何使用 wasm_mt_pool。 [ 在线 | 源代码 ]
  • http - 基于 wasm_mt_pool 的多线程服务器。 [ 在线 | 源代码 ]
  • pool_arraybuffers - 使用 ThreadPool::new_with_arraybuffers() 的演示。 [ 在线 | 源代码 ]

入门

要求

Cargo.toml

wasm-mt-pool = "0.1"
serde = { version = "1.0", features = ["derive"] }
serde_closure = "0.3"

用法

#![feature(async_closure)]

use wasm_mt_pool::prelude::*;
use wasm_mt::utils::{console_ln, sleep};

let size = 2;
let pkg_js = "./pkg/pool_exec.js"; // path to `wasm-bindgen`'s JS binding
let pool = ThreadPool::new(size, pkg_js).and_init().await.unwrap();

let num = 4;

console_ln!("a) 💦 pool_exec! {} closures:", num);
for _ in 0..num {
    pool_exec!(pool, move || {
        console_ln!("a) closure: done.");
        Ok(JsValue::NULL)
    });
}

console_ln!("b) 💦 pool_exec! {} async closures:", num);
for _ in 0..num {
    pool_exec!(pool, async move || {
        sleep(1000).await;
        console_ln!("b) async closure: done.");
        Ok(JsValue::NULL)
    });
}

let cb = move |result| {
    console_ln!("callback: result: {:?}", result);
};

console_ln!("c) 💦 pool_exec! {} closures with callback:", num);
for _ in 0..num {
    pool_exec!(pool, move || {
        console_ln!("c) closure: done.");
        Ok(JsValue::from("C"))
    }, cb);
}

console_ln!("d) 💦 pool_exec! {} async closures with callback:", num);
for _ in 0..num {
    pool_exec!(pool, async move || {
        sleep(1000).await;
        console_ln!("d) async closure: done.");
        Ok(JsValue::from("D"))
    }, cb);
}

sleep(6_000).await; // Do sleep long enough to ensure all jobs are completed.
assert_eq!(pool.count_pending_jobs(), 0);

依赖

~8–12MB
~226K SLoC