Source code for scalib.config.threading

"""Configuration of SCALib's threadpool."""

import os

from scalib import _scalib_ext


[docs]class ThreadPool: """SCALib threadpool. All computationally-heavy operations of SCALib are run on a thread pool. To use the configured `ThreadPool`, use `thread_context` or `default_threadpool`. """ def __init__(self, n_threads): self.n_threads = n_threads self._pool = None @property def pool(self): # We initialize the true threadpool lazily for 2 reasons: # - It avoids creating threads when importing SCALib, which reduces # import time and, more importantly, prevents bugs with the usage of # subprocesses (such as with concurrent.futures.ProcessPoolExecutor), # since the POSIX API does not allow fork'ing after threadds have been # created. # - It generally improves performance when the threadpool is not actually used. if self._pool is None: self._pool = _scalib_ext.ThreadPool(self.n_threads) return self._pool
def _default_num_threads(): num_threads = os.environ.get("SCALIB_NUM_THREADS") if num_threads is None: num_threads = _scalib_ext.usable_parallelism() else: try: num_threads = int(num_threads) except ValueError: raise ValueError( "Environment variable SCALIB_NUM_THREADS must be an integer." ) return num_threads