1 个不稳定版本

0.1.0 2024年7月30日

#104性能分析

Download history 127/week @ 2024-07-28 5/week @ 2024-08-04

132 每月下载量
用于 proc_guard

MIT 许可证

28KB
344

子进程等待超时包

概述

子进程等待超时包提供了一种简单高效的方法来等待子进程退出,可选的超时时间。它根据平台和可用功能提供多种实现方法,确保在不同环境中实现最佳性能和可靠性。

功能

  • 超时处理:允许指定子进程退出的最大等待时间。
  • 跨平台支持:无缝地在 Windows 和 Unix 系统上工作。
  • 多种实现方法
    • Windows:使用 WaitForSingleObject
    • Unix:默认使用 thread。用户可以根据功能标志选择使用 pidfdthreadsignal,优先顺序为 pidfd,然后 thread,最后 signal
  • 性能:最小开销,基准测试结果表明方法之间差异可以忽略不计。
  • 错误处理:提供清晰的错误消息,包括超时错误。

安装

将以下内容添加到您的 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

根据指定的功能标志,使用 pidfdthreadsignal 实现。优先顺序为

  1. pidfd:Linux 5.3 及以上版本兼容的简单实现。
  2. thread:POSIX 兼容。
  3. 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