#send-sync #sync #web #no-std

no-std maybe-sync

为希望在不同多线程和单线程版本间切换的库提供辅助的crate

2个版本

0.1.1 2020年6月15日
0.1.0 2020年6月15日

#592 in WebAssembly

Download history 1/week @ 2024-04-14 10/week @ 2024-04-21 16/week @ 2024-04-28 34/week @ 2024-05-05 22/week @ 2024-05-12 35/week @ 2024-05-19 52/week @ 2024-05-26 79/week @ 2024-06-02 37/week @ 2024-06-09 56/week @ 2024-06-16 29/week @ 2024-06-23 8/week @ 2024-06-30 1/week @ 2024-07-07 18/week @ 2024-07-14 11/week @ 2024-07-21 21/week @ 2024-07-28

51 每月下载量
用于 galileo

MIT/Apache

37KB
188

maybe-sync

这个crate帮助创建灵活的库,这些库可以在多线程和单线程环境中运行。

crates docs License License

为什么需要它?

创建一个在桌面/服务器或Web浏览器环境中都能工作的库可能很困难。

在桌面/服务器环境中,crate通常可以与多个线程一起使用,并在需要的地方添加SendSync trait界限。同时,web-sys - 一个事实上的标准crate,用于使用浏览器API - 为程序员提供了!Send + !Sync类型,这些类型在放置SendSync界限在API调用时不能使用。

例如,资产加载crate goods 使用泛型执行器来驱动加载过程。一些执行器只能与可发送的future一起工作:tokio,一些需要可发送的future才能在多个线程上运行:async-stdactix-rt,其他可以在单线程中使用任何future: wasm_bindgen_futures::spawn_local

goods 中,Web的一个基本数据源 - FetchSource - 使用浏览器的Fetch API从Web获取数据并产生不可发送的future。

这就是为什么当启用“sync”特性时,goods::Spawn::spawn 方法接收一个 maybe_sync::BoxFuture,这是一个可发送的boxed future,允许使用多线程的future执行器。如果没有启用“sync”特性,maybe_sync::BoxFuture 将是一个不可发送的boxed future,只有在这种情况下,FetchSource 才存在。

ECS 库也有类似的故事。其中大多数库要求组件是 Send + Sync,这样系统就可以从任何线程访问它们。这使得无法在组件中使用来自 web-sys 的类型。

一些小型应用程序可能希望在其依赖项中关闭“sync”特性,因为它们是单线程的,并且不想为他们不需要的东西付费。

MaybeSendMaybeSync

标记特质 MaybeSendMaybeSync 可以用于where子句和界限中替代 SendSync 特质。

当“sync”特性被启用时,MaybeSend 实际上是重导出 Send 特质,而 MaybeSync 重导出 Sync 特质。从而允许具有这些界限的类型在线程之间发送或共享。

当“sync”特性未被启用时,MaybeSendMaybeSync 是为所有类型实现的空特质,当用作界限时,允许不满足 SendSync 界限的类型。

这使得忘记启用“sync”特性并意外地将 !Send 值发送到另一个线程变得不可能。应该使用实际的 Send 而不是 MaybeSend 界限,来发送值到另一个线程的函数。

BoxFuture

boxed future 的类型别名。当“sync”特性被启用时,它是可发送的。它被设计用来作为特质函数的返回类型,其中只有当“sync”特性未被启用时,才存在仅产生不可发送future的特质实现。当放置 MaybeSend 界限时,它可以作为函数参数类型。

Rc

当“sync”特性未启用时,类型别名用于 alloc::rc::Rc,或者当“sync”特性启用时,用于 alloc::sync::Arc。这为已使用 maybe-sync crate 的crate提供优化目的。

Mutex

当“sync”特性启用时,类型别名用于 parking_lot::Mutex,否则为 core::cell::RefCell 的薄封装。这为已使用 maybe-sync crate 的crate提供优化目的。

许可证

此存储库的许可证为以下之一

任选一项。

贡献许可证

除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,均应按上述方式双许可,无需任何附加条款或条件。

依赖关系

~0–325KB