|
|
import os |
|
|
import re |
|
|
import subprocess |
|
|
|
|
|
|
|
|
__all__ = ['available_cpu_count'] |
|
|
|
|
|
|
|
|
def available_cpu_count(): |
|
|
""" Number of available virtual or physical CPUs on this system, i.e. |
|
|
user/real as output by time(1) when called with an optimally scaling |
|
|
userspace-only program""" |
|
|
|
|
|
|
|
|
|
|
|
try: |
|
|
m = re.search(r'(?m)^Cpus_allowed:\s*(.*)$', |
|
|
open('/proc/self/status').read()) |
|
|
if m: |
|
|
res = bin(int(m.group(1).replace(',', ''), 16)).count('1') |
|
|
if res > 0: |
|
|
return res |
|
|
except IOError: |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
import multiprocessing |
|
|
return multiprocessing.cpu_count() |
|
|
except (ImportError, NotImplementedError): |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
import psutil |
|
|
return psutil.cpu_count() |
|
|
except (ImportError, AttributeError): |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
res = int(os.sysconf('SC_NPROCESSORS_ONLN')) |
|
|
|
|
|
if res > 0: |
|
|
return res |
|
|
except (AttributeError, ValueError): |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
res = int(os.environ['NUMBER_OF_PROCESSORS']) |
|
|
|
|
|
if res > 0: |
|
|
return res |
|
|
except (KeyError, ValueError): |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
from java.lang import Runtime |
|
|
runtime = Runtime.getRuntime() |
|
|
res = runtime.availableProcessors() |
|
|
if res > 0: |
|
|
return res |
|
|
except ImportError: |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
sysctl = subprocess.Popen(['sysctl', '-n', 'hw.ncpu'], |
|
|
stdout=subprocess.PIPE) |
|
|
scStdout = sysctl.communicate()[0] |
|
|
res = int(scStdout) |
|
|
|
|
|
if res > 0: |
|
|
return res |
|
|
except (OSError, ValueError): |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
res = open('/proc/cpuinfo').read().count('processor\t:') |
|
|
|
|
|
if res > 0: |
|
|
return res |
|
|
except IOError: |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
pseudoDevices = os.listdir('/devices/pseudo/') |
|
|
res = 0 |
|
|
for pd in pseudoDevices: |
|
|
if re.match(r'^cpuid@[0-9]+$', pd): |
|
|
res += 1 |
|
|
|
|
|
if res > 0: |
|
|
return res |
|
|
except OSError: |
|
|
pass |
|
|
|
|
|
|
|
|
try: |
|
|
try: |
|
|
dmesg = open('/var/run/dmesg.boot').read() |
|
|
except IOError: |
|
|
dmesgProcess = subprocess.Popen(['dmesg'], stdout=subprocess.PIPE) |
|
|
dmesg = dmesgProcess.communicate()[0] |
|
|
|
|
|
res = 0 |
|
|
while '\ncpu' + str(res) + ':' in dmesg: |
|
|
res += 1 |
|
|
|
|
|
if res > 0: |
|
|
return res |
|
|
except OSError: |
|
|
pass |
|
|
|
|
|
raise Exception('Can not determine number of CPUs on this system') |
|
|
|