import os
import re
import subprocess
import warnings
# %%
[docs]def get_core_count():
"""Get the number of available virtual or physical CPUs on this system"""
# cpuset
# cpuset may restrict the number of *available* processors
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
# Python 2.6+
try:
import multiprocessing
return multiprocessing.cpu_count()
except (ImportError, NotImplementedError):
pass
# https://github.com/giampaolo/psutil
try:
import psutil
return psutil.cpu_count() # psutil.NUM_CPUS on old versions
except (ImportError, AttributeError):
pass
# POSIX
try:
res = int(os.sysconf("SC_NPROCESSORS_ONLN"))
if res > 0:
return res
except (AttributeError, ValueError):
pass
# Windows
try:
res = int(os.environ["NUMBER_OF_PROCESSORS"])
if res > 0:
return res
except (KeyError, ValueError):
pass
# jython
try:
from java.lang import Runtime
runtime = Runtime.getRuntime()
res = runtime.availableProcessors()
if res > 0:
return res
except ImportError:
pass
# BSD
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
# Linux
try:
res = open("/proc/cpuinfo").read().count("processor\t:")
if res > 0:
return res
except IOError:
pass
# Solaris
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
# Other UNIXes (heuristic)
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
warnings.warn("Can not determine number of CPUs on this system", RuntimeWarning)