5 个版本
0.2.1 | 2023 年 4 月 16 日 |
---|---|
0.2.0 |
|
0.1.5 | 2022 年 6 月 27 日 |
0.1.4 | 2021 年 4 月 28 日 |
0.1.3 |
|
#203 在 并发 中排名
34 每月下载量
用于 4 个 Crates (3 直接)
20KB
254 行
permit::Permit
是一个用于取消操作的结构体。
用例
- 优雅的服务器关闭
- 取消耗时过长的操作
- 在撤销授权时停止正在进行的操作
特性
- 从属许可。撤销许可也会递归地撤销其从属许可。
- 释放许可以递归地撤销其从属许可。
- 等待所有从属许可释放。
- 实现了
Future
。您可以await
许可,并在它被撤销时返回。 - 类似于 Golang 的
context
- 仅依赖于
std
。 禁止(不安全代码)
- 100% 测试覆盖率
限制
- 不保留数据值
- 分配。使用
alloc::sync::Arc
。
替代方案
async_ctx
- 良好的 API
- 异步操作
stopper
- 异步操作
io-context
- 保留 Any 值
- 未维护
ctx
相关 Crates
示例
优雅关闭
let top_permit = permit::Permit::new();
// Start some worker threads.
for _ in 0..5 {
let permit = top_permit.new_sub();
std::thread::spawn(move || {
while !permit.is_revoked() {
// ...
}
});
}
wait_for_shutdown_signal();
// Revoke all thread permits and wait for them to
// finish and drop their permits.
top_permit
.revoke()
.wait_subs_timeout(Duration::from_secs(3))
.unwrap();
Cargo Geiger 安全报告
Metric output format: x/y
x = unsafe code used by the build
y = total unsafe code found in the crate
Symbols:
🔒 = No `unsafe` usage found, declares #![forbid(unsafe_code)]
❓ = No `unsafe` usage found, missing #![forbid(unsafe_code)]
☢️ = `unsafe` usage found
Functions Expressions Impls Traits Methods Dependency
0/0 0/0 0/0 0/0 0/0 🔒 permit 0.2.1
0/0 0/0 0/0 0/0 0/0
变更日志
- v0.2.1 - 修复了
sleep
和sleep_until
有时不会提前返回的问题。 - v0.2.0
- 将
try_wait_for
重命名为wait_subs_timeout
- 将
try_wait_until
重命名为wait_subs_deadline
- 在
wait*
方法中将自旋锁替换为 Condvar - 移除
wait
- 添加
sleep
和sleep_until
- 将
- v0.1.5 - 实现
Debug
- v0.1.4 - 修复了 bug,其中
revoke()
和然后wait()
不会等待。 - v0.1.3
- 不要保留或唤醒过时的
std::task::Waker
结构。 - 消除导致不必要的唤醒的竞争条件。
- 不要保留或唤醒过时的
- v0.1.2 - 实现
Future
- v0.1.1 - 使
revoke
返回&Self
- v0.1.0 - 初始版本
许可协议:Apache-2.0