import os
import multiprocessing
def number_of_cores():
"""
Try to determine the number of CPU cores in this system.
If successful return that number. Otherwise return 1.
"""
try:
n = int(os.environ["SAGE_NUM_CORES"])
if n > 0:
return n
except (ValueError, KeyError):
pass
try:
n = multiprocessing.cpu_count()
if n > 0:
return n
except NotImplementedError:
pass
try:
from subprocess import Popen, PIPE
p = Popen(['sysctl', '-n', 'hw.ncpu'],
stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
n = int(p.stdout.read().strip())
if n > 0:
return n
except (ValueError, OSError):
pass
return 1
def num_threads():
"""
Determine the number of threads from the environment variable
:envvar:`SAGE_NUM_THREADS`. If it is 0 or not provided, use a default
of ``min(8, number_of_cores)``.
OUTPUT:
a tuple (num_threads, num_threads_parallel, num_cores)
"""
num_cores = number_of_cores()
num_threads = None
num_threads_parallel = num_threads
if num_threads_parallel is None:
num_threads_parallel = max(min(8, num_cores), 2)
try:
sage_num_threads = int(os.environ["SAGE_NUM_THREADS"])
if sage_num_threads == 0:
if num_threads is None:
num_threads = min(8, num_cores)
elif sage_num_threads > 0:
num_threads = sage_num_threads
num_threads_parallel = sage_num_threads
except (ValueError, KeyError):
pass
if num_threads is None:
num_threads = 1
try:
sage_num_threads = int(os.environ["SAGE_NUM_THREADS_PARALLEL"])
if sage_num_threads > 0:
num_threads_parallel = sage_num_threads
except (ValueError, KeyError):
pass
return (num_threads, num_threads_parallel, num_cores)
print(*num_threads())