10个版本
0.2.4 | 2022年3月31日 |
---|---|
0.2.3 | 2022年3月17日 |
0.1.6 | 2022年2月25日 |
0.1.5 | 2021年3月26日 |
0.1.3 | 2020年12月29日 |
#1858 in 异步
166 每月下载量
在 14 个crate中使用 (5 个直接使用)
34KB
423 行
safina-sync
在异步任务之间共享或发送数据的结构体。
它是安全异步运行时 safina
的一部分。
特性
Mutex
具有异步锁方法oneshot
和sync_channel
具有异步和阻塞方法禁止(不安全代码)
- 仅依赖于
std
- 100% 测试覆盖率
- 与
safina-executor
或任何异步执行器兼容
限制
- 分配
- 没有const构造函数。内部使用
std::sync::Mutex
,它没有const构造函数。请参阅 rust#66806 和 const-eval#3。您可以使用不稳定core::lazy::OnceCell
或各种unsafe
crate:lazy_static
,once_cell
,lazycell
和conquer-once
。
文档
示例
use std::sync::Arc;
use safina_async_test::async_test;
use safina_sync::Mutex;
let shared_counter: Arc<Mutex<u32>> = get_shared_data();
{
let mut counter_guard = shared_counter.lock().await;
*counter_guard += 1;
// some_async_fn().await; // Cannot await while holding a MutexGuard.
}
some_async_fn().await; // Await is ok after releasing MutexGuard.
替代方案
- async-lock
- 包含少量不安全代码
- futures-locks
- 包含少量不安全代码
- futures-util
- 非常受欢迎
- 充满不安全代码
- tokio-sync
- 非常受欢迎
- 快速
- 内部极其复杂
- 充满不安全代码
变更日志
- v0.2.4
- 为
Eq
和PartialEq
实现Receiver
、OneSender
和SyncSender
。 - 修复了在
Receiver
上调用await
不会唤醒发送者的错误。
- 为
- v0.2.3 修复竞争条件。
- v0.2.2 修复 Linux 上的死锁问题。
- v0.2.1
- 添加了
sync_channel
和SyncSender
。 - 添加了
Receiver::async_recv
以允许用户在没有编写难看的(&mut receiver).await
的情况下等待。 - 移除了
Receiver::blocking
并添加了try_recv
、recv
等。
- 添加了
- v0.2.0 - 用
oneshot
、OneSender
和支持异步和阻塞读取的Receiver
替换Promise
。 - v0.1.6 - 更新文档。
- v0.1.5 - 更新文档
- v0.1.4 - 更新文档,将
MutexGuard::new
设置为非公开 - v0.1.3 - 修复 Promise 类型参数
- v0.1.2 - 添加 Promise
- v0.1.1 - 当有多个等待者时改进 Mutex 性能
- v0.1.0 - 首次发布版本
待办事项
- 添加
Barrier
- 添加
RwLock
- 添加
WaitableBool
- 添加
UnboundedChannel
- 添加
WaitableQueue
(多个接收者) - 添加
UnboundedWaitableQueue
- 添加
Topic
(将消息复制到每个接收者)
发布流程
- 编辑
Cargo.toml
并增加版本号。 - 运行
./release.sh
许可:Apache-2.0