【问题标题】:How to exit a process run with Ruby if it takes more than 5 seconds?如果需要超过 5 秒,如何退出使用 Ruby 运行的进程?
【发布时间】:2011-01-01 12:44:29
【问题描述】:

我正在用 Ruby 实现一个检查系统。它运行具有不同测试的可执行文件。如果解决方案不正确,它可能需要很长时间才能完成某些严格的测试。这就是为什么我想将执行时间限制为 5 秒。

我正在使用 system() 函数来运行可执行文件:

system("./solution");

.NET 有一个很棒的 WaitForExit() 方法,那么 Ruby 呢?

有没有办法将外部进程的执行时间限制为 5 秒?

谢谢

【问题讨论】:

    标签: ruby process execution-time


    【解决方案1】:

    您可以使用标准超时库,如下所示:

    require 'timeout'
    Timeout::timeout(5) { system("./solution") }
    

    这样您就不必担心同步错误。

    【讨论】:

    • 我选择了这个作为接受的答案,因为与 EnabrenTane 的解决方案不同,每个测试至少不需要 5 秒即可完成。我使用 system("sudo killall solution") 杀死正在运行的进程。
    【解决方案2】:

    fork 执行“./solution”的孩子,睡眠,检查它是否完成,如果没有杀死它。这应该可以帮助您入门。

    pid = Process.fork{ system("./solution")}
    sleep(5)
    Process.kill("HUP", pid)
    

    http://www.ruby-doc.org/core/classes/Process.html#M003153

    【讨论】:

    • 感谢您的链接。我看到我可以使用 fork 方法。但是如何将它与 system("./solution") 连接起来?
    • 非常感谢!这正是我需要的。只有一个问题。现在所有测试都需要 5 秒。然而,大多数测试在不到一秒的时间内通过。有什么办法可以解决吗?
    • 原来进程只在“内部”Ruby 中被杀死。它继续进行下一个测试。但是,它们仍在活动监视器中占用所有 CPU。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多