1 个不稳定版本
0.1.0 | 2024年7月30日 |
---|
#104 在 性能分析
132 每月下载量
用于 proc_guard
28KB
344 行
子进程等待超时包
概述
子进程等待超时包提供了一种简单高效的方法来等待子进程退出,可选的超时时间。它根据平台和可用功能提供多种实现方法,确保在不同环境中实现最佳性能和可靠性。
功能
- 超时处理:允许指定子进程退出的最大等待时间。
- 跨平台支持:无缝地在 Windows 和 Unix 系统上工作。
- 多种实现方法
- Windows:使用
WaitForSingleObject
。 - Unix:默认使用
thread
。用户可以根据功能标志选择使用pidfd
、thread
或signal
,优先顺序为pidfd
,然后thread
,最后signal
。
- Windows:使用
- 性能:最小开销,基准测试结果表明方法之间差异可以忽略不计。
- 错误处理:提供清晰的错误消息,包括超时错误。
安装
将以下内容添加到您的 Cargo.toml
[dependencies]
child_wait_timeout = "0.1.0"
使用
以下是如何使用此包的基本示例
use std::time::Duration;
use std::process::Command;
use child_wait_timeout::ChildWT;
fn main() {
let mut child = if cfg!(target_os = "windows") {
Command::new("timeout").args(["/t", "2"]).spawn()?
} else {
Command::new("sleep").arg("2").spawn()?
};
let status = child.wait_timeout(Duration::from_secs(2));
match status {
Ok(exit_status) => println!("Process exited with status: {:?}", exit_status),
Err(e) if e.kind() == std::io::ErrorKind::TimedOut => println!("Process timed out"),
Err(e) => println!("Failed to wait on process: {:?}", e),
}
}
平台特定行为
Windows
使用 WaitForSingleObject
实现。
Unix
根据指定的功能标志,使用 pidfd
、thread
或 signal
实现。优先顺序为
pidfd
:Linux 5.3 及以上版本兼容的简单实现。thread
:POSIX 兼容。signal
:POSIX 兼容但存在副作用。
基准测试结果
100 次测量的平均执行时间(毫秒)
对于 "sleep 0"
方法 | 时间(毫秒) | 百分比 |
---|---|---|
wait | 4.4810 | 100.00% |
wait_timeout with pidfd | 4.4646 | 99.63% |
wait_timeout with thread | 4.4688 | 99.73% |
使用信号等待 | 4.4861 | 100.11% |
对于 "sleep 1" 命令
方法 | 时间(毫秒) | 百分比 |
---|---|---|
wait | 1.0236 | 100.00% |
wait_timeout with pidfd | 1.0228 | 99.92% |
wait_timeout with thread | 1.0237 | 100.01% |
使用信号等待 | 1.0233 | 99.97% |
对于 "sleep 1000" 命令,超时时间为1秒
方法 | 时间(毫秒) | 百分比 |
---|---|---|
休眠 | 1.0004 | 100.00% |
wait_timeout with pidfd | 1.0013 | 100.09% |
wait_timeout with thread | 1.0005 | 100.01% |
使用信号等待 | 1.0004 | 100.00% |
解释
数据显示,所有方法在执行速度方面是等效的。执行时间上的差异并不显著,表明任何一种方法都可以互换使用,而不会影响性能。与进程创建相比,性能开销似乎可以忽略不计。
许可证
本项目采用MIT许可证。有关详细信息,请参阅许可证文件。
如果您发现任何错误或功能请求,请随时提交问题或拉取请求。欢迎贡献!
依赖项
~0.4–400KB