Source code for bluecellulab.simulation.parallel
"""Controlled simulations in parallel."""
from __future__ import annotations
import multiprocessing
from multiprocessing.pool import Pool
from bluecellulab.simulation.neuron_globals import NeuronGlobals
[docs]
class IsolatedProcess(Pool):
"""Multiprocessing Pool that restricts a worker to run max 1 process.
Use this when running isolated NEURON simulations. Running 2 NEURON
simulations on a single process is to be avoided. Required global
NEURON simulation parameters will automatically be passed to each
worker. `fork` mode of multiprocessing is used to pass any other
global NEURON parameters to each worker.
"""
def __init__(self, processes: int | None = 1):
"""Initialize the IsolatedProcess pool.
Args:
processes: The number of processes to use for running the simulations.
If set to None, then the number returned by os.cpu_count() is used.
"""
ctx = multiprocessing.get_context("fork")
neuron_global_params = NeuronGlobals.get_instance().export_params()
super().__init__(
processes=processes,
initializer=self.init_worker,
initargs=(neuron_global_params,),
maxtasksperchild=1,
context=ctx,
)
[docs]
@staticmethod
def init_worker(neuron_global_params):
"""Load global parameters for the NEURON environment in each worker
process."""
NeuronGlobals.get_instance().load_params(neuron_global_params)