1 个不稳定版本
使用旧的Rust 2015
0.1.0 | 2017年9月16日 |
---|
#735 in 并发
94,429 每月下载量
用于 7 个crate(2个直接使用)
9KB
115 代码行
runloop
此crate提供了一个可取消的RunLoop
,用于简化编写非阻塞轮询线程。
用法
传递给RunLoop::new()
或RunLoop::new_with_timeout()
的闭包将被调用一次,并在新创建的线程中执行。它应该通过以下示例中命名的回调参数alive
定期检查runloop是否被请求终止。
RunLoop::alive()
允许拥有线程检查runloop是否仍然存活。这可以用于调试(例如断言)或在传递的闭包中失败时提前返回。
RunLoop::cancel()
将请求runloop终止。如果runloop仍然处于活动状态,它将加入线程并阻塞。如果runloop已经自行终止,这将是一个无操作。
示例:一个无限runloop
runloop不必自行终止,它可以等待调用cancel()
方法。
// This runloop runs until we stop it.
let rloop = RunLoop::new(|alive| {
while alive() { /* endless loop */ }
})?;
// Loop a few times.
thread::sleep_ms(500);
assert!(rloop.alive());
// This will cause `alive()` to return false
// and block until the thread was joined.
rloop.cancel();
示例:带超时的runloop
通过new_with_timeout()
创建runloop确保在给定持续时间后alive()
返回false
。
// This runloop will time out after 10ms.
let rloop = RunLoop::new_with_timeout(|alive| {
while alive() { /* endless loop */ }
}, 10)?;
// Wait for the timeout.
while rloop.alive() { /* loop */ }
// This won't block anymore, it's a no-op.
// The runloop has already terminated.
rloop.cancel();
示例:带通道的runloop
由于runloop将在新创建的线程中运行给定的闭包,因此它需要通道和类似工具与拥有线程通信。
let (tx, rx) = channel();
// This runloop will send a lot of numbers.
let rloop = RunLoop::new(move |alive| {
let mut counter = 0u64;
while alive() {
tx.send(counter).unwrap();
counter += 1;
}
})?;
// Wait until we receive a specific number.
while rx.recv().unwrap() < 50 { /* loop */ }
// We've seen enough.
rloop.cancel();
许可证
runloop
根据Mozilla公共许可证第2.0版的规定进行分发。
请参阅授权协议获取详细信息。