#async-io #io #future #async #yew

prokio

兼容 WebAssembly 和非 WebAssembly 目标环境的异步运行时

1 个不稳定版本

0.1.0 2022 年 10 月 19 日

#647异步

Download history 6085/week @ 2024-03-14 6573/week @ 2024-03-21 6398/week @ 2024-03-28 5443/week @ 2024-04-04 6339/week @ 2024-04-11 6297/week @ 2024-04-18 5134/week @ 2024-04-25 5153/week @ 2024-05-02 4735/week @ 2024-05-09 5118/week @ 2024-05-16 4496/week @ 2024-05-23 5316/week @ 2024-05-30 5075/week @ 2024-06-06 5065/week @ 2024-06-13 5011/week @ 2024-06-20 4660/week @ 2024-06-27

20,579 每月下载量
用于 149 包(4 个直接使用)

MIT/Apache

34KB
705

Promise x Tokio = Prokio

兼容 WebAssembly 和非 WebAssembly 目标环境的异步运行时。

设计理念

当设计在由 JavaScript 运行时支持的 WebAssembly 目标和非 WebAssembly 目标(具有本地运行时)上运行的组件和库时,开发人员通常面临需要在整个应用程序中应用多个功能标志的挑战。

  1. 选择与目标运行时兼容的 I/O 和计时器。
  2. 本地运行时通常需要 Send futures,而 WebAssembly 类型通常是 !Send

实现

为了缓解这些问题,Prokio 实现了一个单线程运行时,可以执行 ?Send (Send!Send) futures。

在支持多线程的平台中,prokio 会根据 CPU 核心数量创建多个独立运行时。当使用运行时句柄创建任务时,它将从内部池中随机选择一个工作线程。所有使用 spawn_local 创建的任务将在与任务运行相同的线程上运行。当运行时在 WebAssembly 目标上运行时,所有任务都将调度在主线程上。

此运行时旨在针对 IO 限制型工作负载,具有类似运行时成本。在运行 I/O 工作负载时,它会产生略微更好的性能,因为任务永远不会移动到其他线程。然而,如果工作线程繁忙,其他线程将无法窃取繁忙线程上排队的任务。当您有一个 CPU 限制型任务,其中 CPU 时间显著更昂贵时,应使用专用线程(或 Web Worker)创建该任务,并使用通道与应用程序通信。

Prokio 提供以下组件

  1. 一个能够运行非-Send 任务的调度器。
  2. 一个与调度器后端兼容的计时器。
  3. 任务同步机制。

运行时后端

Prokio 运行时根据目标平台实现了不同的运行时,可以使用所选本地运行时的所有功能(定时器/IO/任务同步)

  • wasm-bindgen-futures(WebAssembly 目标)
  • tokio(非 WebAssembly 目标)

依赖项

~1.2–4.5MB
~82K SLoC