2个版本
0.1.1 | 2020年6月15日 |
---|---|
0.1.0 | 2020年6月15日 |
#592 in WebAssembly
51 每月下载量
用于 galileo
37KB
188 行
maybe-sync
这个crate帮助创建灵活的库,这些库可以在多线程和单线程环境中运行。
为什么需要它?
创建一个在桌面/服务器或Web浏览器环境中都能工作的库可能很困难。
在桌面/服务器环境中,crate通常可以与多个线程一起使用,并在需要的地方添加Send
和Sync
trait界限。同时,web-sys
- 一个事实上的标准crate,用于使用浏览器API - 为程序员提供了!Send + !Sync
类型,这些类型在放置Send
或Sync
界限在API调用时不能使用。
例如,资产加载crate goods
使用泛型执行器来驱动加载过程。一些执行器只能与可发送的future一起工作:tokio
,一些需要可发送的future才能在多个线程上运行:async-std
,actix-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”特性,因为它们是单线程的,并且不想为他们不需要的东西付费。
MaybeSend
和 MaybeSync
标记特质 MaybeSend
和 MaybeSync
可以用于where子句和界限中替代 Send
和 Sync
特质。
当“sync”特性被启用时,MaybeSend
实际上是重导出 Send
特质,而 MaybeSync
重导出 Sync
特质。从而允许具有这些界限的类型在线程之间发送或共享。
当“sync”特性未被启用时,MaybeSend
和 MaybeSync
是为所有类型实现的空特质,当用作界限时,允许不满足 Send
或 Sync
界限的类型。
这使得忘记启用“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 License,版本 2.0,(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT 许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
任选一项。
贡献许可证
除非您明确表示,否则根据 Apache-2.0 许可证定义的,您有意提交的任何贡献,均应按上述方式双许可,无需任何附加条款或条件。
依赖关系
~0–325KB