1 个不稳定版本

使用旧的 Rust 2015

0.1.0 2016年1月23日

#60 in #可组合

Download history 31/week @ 2024-03-11 31/week @ 2024-03-18 40/week @ 2024-03-25 60/week @ 2024-04-01 25/week @ 2024-04-08 29/week @ 2024-04-15 23/week @ 2024-04-22 14/week @ 2024-04-29 17/week @ 2024-05-06 25/week @ 2024-05-13 21/week @ 2024-05-20 14/week @ 2024-05-27 17/week @ 2024-06-03 13/week @ 2024-06-10 18/week @ 2024-06-17 23/week @ 2024-06-24

72 每月下载量
4 crates 中使用

MIT 许可证

605KB
1K SLoC

JavaScript 1K SLoC // 0.1% comments Rust 308 SLoC // 0.3% comments

包含 (WOFF 字体, 120KB) gh-pages/doc/Heuristica-Italic.woff, (WOFF 字体, 90KB) gh-pages/doc/FiraSans-Medium.woff, (WOFF 字体, 92KB) gh-pages/doc/FiraSans-Regular.woff, (WOFF 字体, 56KB) gh-pages/doc/SourceCodePro-Regular.woff, (WOFF 字体, 56KB) gh-pages/doc/SourceCodePro-Semibold.woff, (WOFF 字体, 49KB) gh-pages/doc/SourceSerifPro-Bold.woff 和更多

rust-cancellation 构建状态

Rust-Cancellation 是一个小的 Rust crate,它提供了一个可以以可组合的方式用于向其他代码发出取消信号的 CancellationToken 类型。


版权所有 © 2016 Daniel Grunwald。 MIT 许可证

用法

要使用 cancellation,将以下内容添加到您的 Cargo.toml

[dependencies]
cancellation = "0.1"

有关更多信息,请参阅文档


lib.rs:

Rust-Cancellation 是一个小的 crate,它提供了一个可以以可组合的方式用于向其他代码发出取消信号的 CancellationToken 类型。

支持取消的操作通常接受一个 ct: &CancellationToken 参数。它们可以协作地检查 ct.is_canceled(),或者使用 ct.run() 通过回调在请求取消时获得通知。

异步完成的操作可能接受 ct: Arc<CancellationToken>

要创建一个 CancellationToken,请使用类型 CancellationTokenSource。一个 CancellationTokenSource 包含一个 Arc<CancellationToken>(可以通过 token() 方法或使用解引用强制转换来获取),并提供 cancel() 操作来标记令牌已取消。

extern crate cancellation;
use cancellation::{CancellationToken, CancellationTokenSource, OperationCanceled};
use std::{time, thread};

fn cancelable_sum(values: &[i32], ct: &CancellationToken) -> Result<i32, OperationCanceled> {
let mut sum = 0;
for val in values {
try!(ct.result());
sum = sum + val;
thread::sleep(time::Duration::from_secs(1));
}
Ok(sum)
}

fn main() {
let cts = CancellationTokenSource::new();
cts.cancel_after(time::Duration::from_millis(1500));
assert_eq!(Err(OperationCanceled), cancelable_sum(&[1,2,3], &cts));
}

使用 CancellationToken::run() 方法,当令牌被取消时可以执行一个操作。

extern crate cancellation;
use cancellation::{CancellationToken, CancellationTokenSource, OperationCanceled};
use std::{time, thread};
use std::time::Duration;

fn cancelable_sleep(dur: Duration, ct: &CancellationToken) -> Result<(), OperationCanceled> {
let th = thread::current();
ct.run(
|| { // the on_cancel closure runs on the canceling thread when the token is canceled
th.unpark();
},
|| { // this code block runs on the current thread and contains the cancelable operation
thread::park_timeout(dur) // (TODO: handle spurious wakeups)
}
);
if ct.is_canceled() {
// The run() call above has a race condition: the on_cancel callback might call unpark()
// after park_timeout gave up after waiting dur, but before the end of the run() call
// deregistered the on_cancel callback.
// We use a park() call with 0s timeout to consume the left-over parking token, if any.
thread::park_timeout(Duration::from_secs(0));
Err(OperationCanceled)
} else {
Ok(())
}
}

fn main() {
let cts = CancellationTokenSource::new();
cts.cancel_after(Duration::from_millis(250));
assert_eq!(Err(OperationCanceled), cancelable_sleep(Duration::from_secs(10), &cts));
}

无运行时依赖