// The ``runtime.GetCPUCount`` function tries to detect the number of CPUs on // the current machine. func GetCPUCount() (count int) { // On BSD systems, it should be possible to use ``sysctl -n hw.ncpu`` to // figure this out. if (Platform == "darwin") || (Platform == "freebsd") { output, err := command.GetOutput( []string{"/usr/sbin/sysctl", "-n", "hw.ncpu"}, ) if err != nil { return 1 } count, err = strconv.Atoi(strings.TrimSpace(output)) if err != nil { return 1 } // Linux systems provide introspection via ``/proc/cpuinfo``. } else if Platform == "linux" { output, err := command.GetOutput([]string{"/bin/cat", "/proc/cpuinfo"}) if err != nil { return 1 } for _, line := range strings.Split(output, "\n") { if strings.HasPrefix(line, "processor") { count += 1 } } } // For unknown platforms, we assume that there's just a single processor. if count == 0 { return 1 } return count }
// Try and figure out the number of CPUs on the current machine func GetCPUCount() (count int) { if (Platform == "darwin") || (Platform == "freebsd") { output, err := command.GetOutput([]string{"/usr/sbin/sysctl", "-n", "hw.ncpu"}) if err != nil { return 1 } count, err = strconv.Atoi(strings.TrimSpace(output)) if err != nil { return 1 } } else if Platform == "linux" { output, err := command.GetOutput([]string{"/bin/cat", "/proc/cpuinfo"}) if err != nil { return 1 } for _, line := range strings.Split(output, "\n", 0) { if strings.HasPrefix(line, "processor") { count += 1 } } } if count == 0 { return 1 } return count }
func TestCPUCount(t *testing.T) { cpus := GetCPUCount() output, err := command.GetOutput( []string{ os.Getenv("AMPIFY_ROOT") + "/environ/local/bin/python", "-c", "import multiprocessing; print multiprocessing.cpu_count()"}) if err != nil { t.Errorf("Couldn't call Python:\n%v", err) return } expected, err := strconv.Atoi(strings.TrimSpace(output)) if err != nil { t.Errorf("Couldn't parse the output from Python:\n%v", err) return } if cpus != expected { t.Errorf("Got mis-matched CPU Counts: %d vs. %d", cpus, expected) } }