Source code for sfepy.base.multiproc

"""
Multiprocessing functions.
"""
try:
    from mpi4py import MPI
    use_multiprocessing_mpi = MPI.COMM_WORLD.Get_size() > 1
except ImportError:
    use_multiprocessing_mpi = False

try:
    import sys
    #
    # Multiprocessing_proc implementation is currently broken on platforms
    # using 'spawn' method as default.
    #
    # ToDo: we really need a real fix (Linux fork() method seems to be
    #       insecure/deprecated) !
    #
    if sys.platform.startswith('win'):
        use_multiprocessing_proc = False
    elif sys.platform == 'darwin' and \
        sys.version_info.major == 3 and sys.version_info.minor == 8:
        use_multiprocessing_proc = False
    else:
        from multiprocessing import cpu_count
        use_multiprocessing_proc = cpu_count() > 1
except:
    use_multiprocessing_proc = False

if use_multiprocessing_mpi:
    import sfepy.base.multiproc_mpi as multiproc_mpi
if use_multiprocessing_proc:
    import sfepy.base.multiproc_proc as multiproc_proc

use_multiprocessing = use_multiprocessing_mpi or use_multiprocessing_proc

multiprocessing_mode = None
multiprocessing_module = None


[docs]def get_multiproc(mpi=False): global multiprocessing_mode, multiprocessing_module try_proc = True multiproc, mode = None, None if mpi and use_multiprocessing_mpi: multiproc, mode = multiproc_mpi, 'mpi' try_proc = False if try_proc and use_multiprocessing_proc: multiproc, mode = multiproc_proc, 'proc' multiprocessing_mode = mode multiprocessing_module = multiproc return multiproc, mode
[docs]def get_num_workers(): """Get the number of slave nodes.""" mpi = multiprocessing_mode == 'mpi' return multiproc_mpi.cpu_count() - 1 if mpi else\ multiproc_proc.cpu_count()
[docs]def is_remote_dict(d): if multiprocessing_module is not None: return multiprocessing_module.is_remote_dict(d) else: return False