I once एक ही प्रश्न था। यही कारण है कि मैं अंत में (मैं सी बाइंडिंग नहीं करना चाहता था) के साथ आया है:
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
आप Unix
नहीं करना चाहते हैं आप एक अस्थायी फ़ाइल के लिए Sys.command
लेखन द्वारा open_process_in
बदल सकते थे। लिनक्स और ओएसएक्स पर परीक्षण किया गया, मिंगव पर काम करने की सूचना दी, लेकिन उस समय साइगविन पर नहीं।
अद्यतन। ध्यान दें कि यह freebsd पर काम नहीं करता है, जैसा कि here का उल्लेख किया गया है, आपको sysctl -n hw.ncpu
का उपयोग करने की आवश्यकता है। हालांकि Sys.os_type
में uname -s
के परिणामस्वरूप Win32
से अलग होने पर आपको सही ग्रैन्युलरिटी नहीं है, तो आपको uname -s
के परिणाम पर सशर्त बनाने की आवश्यकता होगी।
स्रोत
2013-04-29 07:40:36
यदि आपको कुछ और नहीं मिला है (यह एक अच्छा उदाहरण के रूप में वकालत नहीं कर रहा है, लेकिन कुछ मैंने पहले हैक किया है) तो आप इसे खोजने के लिए हमेशा 'proc' को पार्स कर सकते हैं। –
हां यह सबसे खराब स्थिति परिदृश्य होगा ... – rgrinberg
मैं या तो एक साफ इंटरफेस के साथ बस 'cpuinfo' लपेटूंगा (मुझे कई पुस्तकालयों को पता है जो यह करते हैं, लेकिन ओकैम में नहीं) या एफएफआई का उपयोग करके [सी से एक] http://stackoverflow.com/questions/4586405/get-number-of-cpus-in-linux-using-c)। (मुझे पता है कि आपने कहा था कि आप दूसरे समाधान से बचना पसंद करते हैं, लेकिन मैंने पहले ओकैम में प्रोफाइलिंग के लिए कुछ ऐसा ही इस्तेमाल किया है।) ध्यान दें कि उस प्रश्न में व्यापक समझौता है कि 'proc' को पार्स करना इतना बुरा नहीं है। –