我正在将我的OCaml程序中的一些工作并行化(parmap但是)我宁愿不将核心数量硬编码到我的应用程序中.有没有办法在运行时获得核心数量?我宁愿不再添加任何依赖项(没有超出parmap或JS的core).我有一种感觉,我在stdlib看到一些简单的电话......
编辑:它不必是便携式的.在linux上工作已经足够了.
我曾经有同样的问题.这就是我最终带来的(我不想要C绑定):
let cpu_count () =
try match Sys.os_type with
| "Win32" -> int_of_string (Sys.getenv "NUMBER_OF_PROCESSORS")
| _ ->
let i = Unix.open_process_in "getconf _NPROCESSORS_ONLN" in
let close () = ignore (Unix.close_process_in i) in
try Scanf.fscanf i "%d" (fun n -> close (); n) with e -> close (); raise e
with
| Not_found | Sys_error _ | Failure _ | Scanf.Scan_failure _
| End_of_file | Unix.Unix_error (_, _, _) -> 1
Run Code Online (Sandbox Code Playgroud)
如果您不希望Unix您可以open_process_in通过Sys.command写入临时文件来替换.在linux和osx上测试过,据报道当时在mingw上工作但不在cygwin上.
更新.请注意,这不适用于freebsd,如此处所述,您需要使用
sysctl -n hw.ncpu.然而,由于Sys.os_type没有合适的粒度你需要条件化的结果uname -s,只要Sys.os_type是不同的Win32.