def new_parallel_pool(ipython_num_engines=None, ipython_profile=None, allow_mpi=True): """Creates a new default |WorkerPool|. If `ipython_num_engines` or `ipython_profile` is given by the user or set as a |default|, an :class:`~pymor.parallel.ipython.IPythonPool` |WorkerPool| will be created using the given parameters via the `ipcluster` script. Otherwise, when `allow_mpi` is `True` and an MPI parallel run is detected, an :class:`~pymor.parallel.mpi.MPIPool` |WorkerPool| will be created. Otherwise, a sequential run is assumed and :attr:`pymor.parallel.dummy.dummy_pool` is returned. """ if ipython_num_engines or ipython_profile: from pymor.parallel.ipython import new_ipcluster_pool nip = new_ipcluster_pool(profile=ipython_profile, num_engines=ipython_num_engines) pool = nip.__enter__() atexit.register(lambda: nip.__exit__(None, None, None)) return pool elif allow_mpi: from pymor.tools import mpi if mpi.parallel: from pymor.parallel.mpi import MPIPool return MPIPool() else: return dummy_pool else: return dummy_pool
def new_parallel_pool(ipython_num_engines=None, ipython_profile=None, allow_mpi=True): """Creates a new default |WorkerPool|. If `ipython_num_engines` or `ipython_profile` is given by the user or set as a |default|, an :class:`~pymor.parallel.ipython.IPythonPool` |WorkerPool| will be created using the given parameters via the `ipcluster` script. Otherwise, when `allow_mpi` is `True` and an MPI parallel run is detected, an :class:`~pymor.parallel.mpi.MPIPool` |WorkerPool| will be created. Otherwise, a sequential run is assumed and :attr:`pymor.parallel.dummy.dummy_pool` is returned. """ global _pool if _pool: logger = getLogger('pymor.parallel.default.new_parallel_pool') logger.warn( 'new_parallel_pool already called; returning old pool (this might not be what you want).' ) return _pool[1] if ipython_num_engines or ipython_profile: from pymor.parallel.ipython import new_ipcluster_pool nip = new_ipcluster_pool(profile=ipython_profile, num_engines=ipython_num_engines) pool = nip.__enter__() _pool = ('ipython', pool, nip) return pool elif allow_mpi: from pymor.tools import mpi if mpi.parallel: from pymor.parallel.mpi import MPIPool pool = MPIPool() _pool = ('mpi', pool) return pool else: _pool = ('dummy', dummy_pool) return dummy_pool else: _pool = ('dummy', dummy_pool) return dummy_pool
def new_parallel_pool(ipython_num_engines=None, ipython_profile=None, allow_mpi=True): """Creates a new default |WorkerPool|. If `ipython_num_engines` or `ipython_profile` is provided as an argument or set as a |default|, an :class:`~pymor.parallel.ipython.IPythonPool` |WorkerPool| will be created using the given parameters via the `ipcluster` script. Otherwise, when `allow_mpi` is `True` and an MPI parallel run is detected, an :class:`~pymor.parallel.mpi.MPIPool` |WorkerPool| will be created. Otherwise, a sequential run is assumed and :attr:`pymor.parallel.dummy.dummy_pool <pymor.parallel.dummy.DummyPool>` is returned. """ global _pool if _pool: logger = getLogger('pymor.parallel.default.new_parallel_pool') logger.warn('new_parallel_pool already called; returning old pool (this might not be what you want).') return _pool[1] if ipython_num_engines or ipython_profile: from pymor.parallel.ipython import new_ipcluster_pool nip = new_ipcluster_pool(profile=ipython_profile, num_engines=ipython_num_engines) pool = nip.__enter__() _pool = ('ipython', pool, nip) return pool elif allow_mpi: from pymor.tools import mpi if mpi.parallel: from pymor.parallel.mpi import MPIPool pool = MPIPool() _pool = ('mpi', pool) return pool else: _pool = ('dummy', dummy_pool) return dummy_pool else: _pool = ('dummy', dummy_pool) return dummy_pool