I once có cùng một câu hỏi. Đó là những gì tôi cuối cùng đi kèm với (tôi không muốn ràng buộc 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
Nếu bạn không muốn Unix
bạn có thể thay thế open_process_in
bởi một văn bản Sys.command
vào một tập tin tạm thời. Thử nghiệm trên linux và osx, báo cáo để làm việc trên mingw nhưng không phải trên Cygwin vào thời điểm đó.
Cập nhật. Lưu ý rằng điều này không hoạt động trên freebsd, như đã đề cập here bạn cần sử dụng sysctl -n hw.ncpu
. Tuy nhiên, kể từ khi Sys.os_type
không có mức chi tiết phù hợp, bạn cần phải điều kiện hóa kết quả của uname -s
bất cứ khi nào Sys.os_type
khác với Win32
.
Nguồn
2013-04-29 07:40:36
nếu bạn không tìm thấy bất cứ điều gì khác (không ủng hộ điều này như là một ví dụ tốt, nhưng một cái gì đó tôi đã hack trước) bạn luôn có thể phân tích cú pháp 'proc' để tìm nó. –
Ya sẽ là trường hợp xấu nhất ... – rgrinberg
Tôi chỉ đơn giản là quấn 'cpuinfo' với giao diện rõ ràng (tôi biết một số thư viện thực hiện điều này, nhưng không phải trong OCaml) hoặc thử sử dụng FFI từ [one from C] (http://stackoverflow.com/questions/4586405/get-number-of-cpus-in-linux-using-c). (Tôi biết bạn nói rằng bạn thích tránh giải pháp thứ hai, nhưng tôi đã sử dụng một cái gì đó tương tự cho profiling trong OCaml trước đây.) Lưu ý rằng ngay cả câu hỏi đó có thỏa thuận rộng mà phân tích 'proc' không phải là một điều xấu. –