Module: Parallel::ProcessorCount

Included in:
Parallel
Defined in:
lib/parallel/processor_count.rb

Overview

TODO: inline this method into parallel.rb and kill physical_processor_count in next major release

Instance Method Summary collapse

Instance Method Details

#physical_processor_countObject

Number of physical processor cores on the current system.



12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/parallel/processor_count.rb', line 12

def physical_processor_count
  @physical_processor_count ||= begin
    ppc = case RbConfig::CONFIG["target_os"]
    when /darwin1/
      IO.popen("/usr/sbin/sysctl -n hw.physicalcpu").read.to_i
    when /linux/
      cores = {}  # unique physical ID / core ID combinations
      phy = 0
      IO.read("/proc/cpuinfo").scan(/^physical id.*|^core id.*/) do |ln|
        if ln.start_with?("physical")
          phy = ln[/\d+/]
        elsif ln.start_with?("core")
          cid = phy + ":" + ln[/\d+/]
          cores[cid] = true if not cores[cid]
        end
      end
      cores.count
    when /mswin|mingw/
      require 'win32ole'
      result_set = WIN32OLE.connect("winmgmts://").ExecQuery(
        "select NumberOfCores from Win32_Processor")
      result_set.to_enum.collect(&:NumberOfCores).reduce(:+)
    else
      processor_count
    end
    # fall back to logical count if physical info is invalid
    ppc > 0 ? ppc : processor_count
  end
end

#processor_countObject

Number of processors seen by the OS, used for process scheduling



7
8
9
# File 'lib/parallel/processor_count.rb', line 7

def processor_count
  @processor_count ||= Integer(ENV['PARALLEL_PROCESSOR_COUNT'] || Etc.nprocessors)
end