【发布时间】: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