gpt4 book ai didi

unix - 为函数设置定时器

转载 作者:行者123 更新时间:2023-12-04 18:08:47 31 4
gpt4 key购买 nike

我定义了一个值列表:data : int list和一个函数 f: int -> unit ,以及一段代码:

for i = 0 to (List.length data) - 1 do
let d = List.nth data i in
f d
done

现在,我想为 f 设置一个最大运行时间。 .例如,如果 f d超过一定时间 maximal ,执行 f d停止,我们继续处理 data 的下一个元素.

有谁知道怎么做?

更新 1:

在评论之后,我想补充一点, f的申请到 data的很大一部分元素最终会引发异常。这很正常,也可以接受。所以代码看起来像:
List.iter
(fun d ->
try
(f d)
with
| e ->
printf "%s\n" (Printexc.to_string e))
data

最佳答案

像这样的事情可能对你有用:

exception Timeout

let run_with_timeout t f x =
try
Sys.set_signal Sys.sigalrm (Sys.Signal_handle (fun _ -> raise Timeout));
ignore (Unix.alarm t);
f x;
ignore (Unix.alarm 0);
Sys.set_signal Sys.sigalrm Sys.Signal_default
with Timeout -> Sys.set_signal Sys.sigalrm Sys.Signal_default

这是一个显示其工作原理的 session :
$ ocaml
OCaml version 4.00.1

# #load "unix.cma";;
# #use "rwt.ml";;
exception Timeout
val run_with_timeout : int -> ('a -> 'b) -> 'a -> unit = <fun>
# run_with_timeout 2 Printf.printf "yes\n";;
yes
- : unit = ()
# run_with_timeout 2 (fun () -> while true do () done) ();;
- : unit = ()
#

您的代码将是这样的:
List.iter (run_with_timeout 10 f) data

(此代码尚未经过彻底测试,但它显示了一种可能有效的方法。)

更新

正如评论所示,如果 f x,此代码不适合可能会引发异常(或者如果您将警报用于其他目的)。我鼓励 gsg 发布他/她改进的解决方案。编辑似乎已被拒绝。

关于unix - 为函数设置定时器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19884923/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com