Spaces:
Running
on
Zero
Running
on
Zero
import math | |
import os | |
import sys | |
try: | |
import psutil | |
except ImportError: | |
psutil = None # type: ignore | |
__all__ = ("cpu_count", "CPU_COUNT") | |
def cpu_count(): | |
"""Get the available CPU count for this system. | |
Takes the minimum value from the following locations: | |
- Total system cpus available on the host. | |
- CPU Affinity (if set) | |
- Cgroups limit (if set) | |
""" | |
count = os.cpu_count() | |
# Check CPU affinity if available | |
if psutil is not None: | |
try: | |
affinity_count = len(psutil.Process().cpu_affinity()) | |
if affinity_count > 0: | |
count = min(count, affinity_count) | |
except Exception: | |
pass | |
# Check cgroups if available | |
if sys.platform == "linux": | |
# The directory name isn't standardized across linux distros, check both | |
for dirname in ["cpuacct,cpu", "cpu,cpuacct"]: | |
try: | |
with open("/sys/fs/cgroup/%s/cpu.cfs_quota_us" % dirname) as f: | |
quota = int(f.read()) | |
with open("/sys/fs/cgroup/%s/cpu.cfs_period_us" % dirname) as f: | |
period = int(f.read()) | |
# We round up on fractional CPUs | |
cgroups_count = math.ceil(quota / period) | |
if cgroups_count > 0: | |
count = min(count, cgroups_count) | |
break | |
except Exception: | |
pass | |
return count | |
CPU_COUNT = cpu_count() | |