#atomic #tokio #async #loom #read-lock

concurrency_toolkit

轻松在 std::sync, tokio::sync 和 loom::sync 之间切换

8 个版本

0.2.8 2021 年 8 月 4 日
0.2.7 2021 年 8 月 4 日
0.1.3 2021 年 7 月 31 日

#855并发

每月 31 次下载

MIT 许可证

14KB
226

concurrency_toolkit

Rust

crate.io downloads

crate.io version

docs

轻松在 std::sync, tokio::sync 和 loom::sync 之间切换

用法

此 crate 提供了两个模块 syncatomic

模块 atomic 默认提供原子原语,是对 core::sync::atomic 的类型别名,当启用 permutation_testing 功能时,提供 loom::sync::atomic

模块 sync 与模块 atomic 类似 -- 它提供来自 std::sync 的原语,在 async_tokio 不使用时,通过 loom::syncpermutation_testing 上同步。

当前,它只提供 ArcRwLock,但未来将添加更多原语。

它还提供了统一的类型定义来处理这些库之间的差异

  • 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