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.



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
41
42
43
# File 'lib/parallel/processor_count.rb', line 13

def physical_processor_count
  @physical_processor_count ||= begin
    ppc =
      case RbConfig::CONFIG["target_os"]
      when /darwin[12]/
        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 unless 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



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

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