【问题标题】:How can I wait for multiple child processes using the OCaml Unix module?如何使用 OCaml Unix 模块等待多个子进程?
【发布时间】:2022-11-22 12:10:09
【问题描述】:

我正在尝试并行化工作。我正在尝试让子进程各自承担一部分工作,然后等待父进程完成工作。

以下解决方案似乎适用于小示例:

let par_iter (items: 'i list) ~(f: 'i -> unit): unit =
  let orig_pid = Unix.getpid () in
  let rec loop = function
    | [] -> ()
    | h :: t ->
      match Unix.fork () with
      | 0 -> f h
      | _ -> loop t
  in
  loop items;
  if Unix.getpid () = orig_pid then 
    List.iter items ~f:(fun _ -> ignore @@ Unix.wait ())
  else
    exit 0

用法:

let () =
  par_iter [1; 2; 3; 4] ~f:do_something_with_an_int;

有多个子进程时的contract of Unix.wait我不是很清楚。在这里,我依赖于 waiting n 次将等待所有且仅 n 子进程完成的行为。

此解决方案是否依赖于未定义的行为?是否有另一种方法可以正确实施par_iter,以便它在子进程上产生工作并等待工作完成?

在 OCaml 4.14.0 上测试

【问题讨论】:

    标签: multiprocessing ocaml


    【解决方案1】:

    如果原始父进程已经有一些子进程,这可能会失败。因此,恕我直言,它不能用作通用库。您应该使用Unix.waitpid 专门等待您创建的进程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 2021-07-27
      • 2010-09-11
      • 1970-01-01
      相关资源
      最近更新 更多