tokio::runtime 可以在 wasm 中使用吗?

Can tokio::runtime be used in wasm?

提问人:Yurii Stolbetskyi 提问时间:11/1/2023 更新时间:11/1/2023 访问量:68

问:

大家。

let rt = tokio::runtime::Runtime::new().unwrap();

当我尝试构建 wasm 时,此代码不起作用。

let rt = tokio::runtime::Runtime::new().unwrap();
   |                              ^^^^^^^ could not find `Runtime` in `runtimе
let rt = tokio::runtime::Runtime::new().unwrap();
    |                     ^^^^^^^ private module

是否可以在 wasm 中使用 tokio::runtime,或者我需要寻找其他方法? 我可以使用多线程吗?

我尝试用rt.block_on启动一个异步函数,因为当前函数不应该是异步的,它在单独的线程中运行。

多线程 Rust WebAssembly rust-tokio wasm-pack

评论


答:

2赞 Chayim Friedman 11/1/2023 #1

Tokio 确实有一些 WASM 支持,请参阅文档中的 WASM 支持。您需要启用该功能(该功能不起作用并导致编译失败)。但是,它不支持多线程运行时(因为 WASM 不支持线程),因此不支持 Runtime::new()。您需要使用 tokio::runtime::Builder::new_current_thread() 并使用方法启用所需的功能(目前仅在 WASI 上)。rtfulltime

但是,如果您真的需要,您应该重新考虑.如果你在浏览器中,使用浏览器 API 和 wasm-bindgen-futures 通过 async/await 与 JavaScript promise 进行交互。如果您在 WASI 上,仍然只提供最低限度的支持,您可能需要寻找其他东西。tokiotokio