8 个版本
0.2.8 | 2021 年 8 月 4 日 |
---|---|
0.2.7 | 2021 年 8 月 4 日 |
0.1.3 | 2021 年 7 月 31 日 |
#855 在 并发
每月 31 次下载
14KB
226 行
concurrency_toolkit
轻松在 std::sync, tokio::sync 和 loom::sync 之间切换
用法
此 crate 提供了两个模块 sync
和 atomic
。
模块 atomic
默认提供原子原语,是对 core::sync::atomic
的类型别名,当启用 permutation_testing
功能时,提供 loom::sync::atomic
。
模块 sync
与模块 atomic
类似 -- 它提供来自 std::sync
的原语,在 async_tokio
不使用时,通过 loom::sync
在 permutation_testing
上同步。
当前,它只提供 Arc
和 RwLock
,但未来将添加更多原语。
它还提供了统一的类型定义来处理这些库之间的差异
RwLockReadGuard
RwLockWriteGuard
LockResult
TryLockResult
还有一个宏来处理 Rust 中调用异步和同步函数的差异
obtain_read_lock!(rwlock 的引用)
obtain_write_lock!(rwlock 的引用)
要创建一个使用 sync::RwLock
的函数,使用 concurrency_toolkit::maybe_async::maybe_async
,它会自动移除所有 async
相关的关键字,如果未使用 async_tokio
。
使用 concurrency_toolkit::maybe_async::maybe_async
的示例
use concurrency_toolkit::maybe_async::maybe_async;
use concurrency_toolkit::sync::{RwLock, obtain_read_lock, obtain_write_lock};
#[maybe_async]
fn get(rwlock: &RwLock<i32>) -> i32 {
*obtain_read_lock!(rwlock).unwrap()
}
#[maybe_async]
fn set(rwlock: &RwLock<i32>, val: i32) {
*obtain_write_lock!(rwlock).unwrap() = val;
}
#[maybe_async]
fn add(rwlock: &RwLock<i32>, val: i32) {
set(rwlock, get(rwlock).await + val).await;
}
测试
此 crate 提供了进程宏 concurrency_toolkit::test
来运行您的测试
#[concurrency_toolkit::test]
fn test() {
// ...
}
如果需要,它将自动启动异步运行时或调用 loom::model
。
然而,与 maybe_async::maybe_async
不同,这个过程宏要求函数不能声明为 async
,这是因为实现细节(syn
提供了解析 async function
的简单方法),但它仍然可以像 `maybe_async::maybe_async` 一样移除相关的关键字。
特性
该软件包目前支持 3 个特性
default
,其中使用std::sync
;async_tokio
,在sync
模块中使用tokio::sync
,在atomic
模块中使用std::sync::atomic
;permutation_testing
,使用loom::sync
。
这些特性是互斥的,因此建议在将此软件包作为依赖项添加时使用 default-features = false
,并让用户明确选择他们想要的特性。
依赖关系
~0.3–28MB
~364K SLoC