Source code for toasty.par_util

# -*- mode: python; coding: utf-8 -*-
# Copyright 2020-2024 the WorldWide Telescope project
# Licensed under the MIT License.

"""Utilities for parallel processing

"""

__all__ = """
SHOW_INFORMATIONAL_MESSAGES
resolve_parallelism
""".split()

import multiprocessing as mp
import os
import sys

SHOW_INFORMATIONAL_MESSAGES = True


[docs] def resolve_parallelism(parallel): """Decide what level of parallelism to use. Parameters ---------- parallel : integer or None The user's specification Returns ------- A positive integer giving the parallelization level. """ if parallel is None: if mp.get_start_method() == "fork": parallel = None # If we seem to be an HPC job, try to guess the number of CPUs based # on the job allocation of CPUs/cores, which might be much lower # than the number of CPUs on the system. Slurm sets many variables # related to this stuff; I *think* the one we're using here is the # most appropriate? slurm_alloc = os.environ.get("SLURM_NPROCS") if slurm_alloc: try: parallel = int(slurm_alloc) except ValueError: pass # If we're still not sure, go with the system CPU count if parallel is None: parallel = os.cpu_count() if SHOW_INFORMATIONAL_MESSAGES and parallel > 1: print(f"info: parallelizing processing over {parallel} CPUs") else: parallel = 1 if parallel > 1 and mp.get_start_method() != "fork": print( """warning: parallel processing was requested but is not possible because this operating system is not using `fork`-based multiprocessing. On macOS a bug prevents forking: https://bugs.python.org/issue33725""", file=sys.stderr, ) parallel = 1 if parallel > 1: return parallel return 1