gpt4 book ai didi

ocaml - 中断 OCaml 中的调用

转载 作者:行者123 更新时间:2023-12-01 10:36:11 26 4
gpt4 key购买 nike

如果计算时间太长,我想中断通话,就像这样

try
do_something ()
with Too_long -> something_else ()

在 OCaml 中可以做类似的事情吗?函数 do_something 不能被修改。

最佳答案

一般来说,中断函数的唯一方法是使用信号,正如 Basile 所建议的那样。不幸的是,控制流将转移到信号处理程序,因此您将无法返回您喜欢的值。要获得更细粒度的控制,您可以在单独的线程中运行 do_something。第一近似值是以下函数:

exception Timeout

let with_timeout timeout f =
let result = ref None in
let finished = Condition.create () in
let guard = Mutex.create () in
let set x =
Mutex.lock guard;
result := Some x;
Mutex.unlock guard in
Mutex.lock guard;
let work () =
let x = f () in
set x;
Condition.signal finished in
let delay () =
Thread.delay timeout;
Condition.signal finished in
let task = Thread.create work () in
let wait = Thread.create delay () in
Condition.wait finished guard;
match !result with
| None ->
Thread.kill task;
raise Timeout
| Some x ->
Thread.kill wait;
x

使用线程和信号函数的解决方案有一些缺点。例如,线程在 OCaml 中在特定的中断点切换,通常这是任何分配。因此,如果您的代码不执行任何分配或外部调用,那么它可能永远不会屈服于其他线程并将永远运行。此类函数的一个很好的示例是 let rec f () = f ()。在这种情况下,您应该在另一个进程而不是线程中运行您的函数。 OCaml 中有许多用于多处理的库,仅举几例:

  1. parmap
  2. forkwork
  3. async-parallel
  4. lwt-parallel

关于ocaml - 中断 OCaml 中的调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35001959/

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