#thread #timeout #polling #non-blocking #optional #cancelable

runloop

可取消的非阻塞轮询线程(带可选超时)

1 个不稳定版本

使用旧的Rust 2015

0.1.0 2017年9月16日

#735 in 并发

Download history 18095/week @ 2023-11-20 13673/week @ 2023-11-27 14912/week @ 2023-12-04 13754/week @ 2023-12-11 9063/week @ 2023-12-18 3030/week @ 2023-12-25 11591/week @ 2024-01-01 13241/week @ 2024-01-08 15262/week @ 2024-01-15 15023/week @ 2024-01-22 20547/week @ 2024-01-29 11036/week @ 2024-02-05 22695/week @ 2024-02-12 19262/week @ 2024-02-19 26770/week @ 2024-02-26 25490/week @ 2024-03-04

94,429 每月下载量
用于 7 个crate(2个直接使用)

MPL-2.0 许可证

9KB
115 代码行

runloop Crates.io 构建状态 License

此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版的规定进行分发。

请参阅授权协议获取详细信息。

无运行时依赖