# encoding: utf-8 """A parallelized function that does scatter/execute/gather.""" __docformat__ = "restructuredtext en" #------------------------------------------------------------------------------- # Copyright (C) 2008 The IPython Development Team # # Distributed under the terms of the BSD License. The full license is in # the file COPYING, distributed as part of this software. #------------------------------------------------------------------------------- #------------------------------------------------------------------------------- # Imports #------------------------------------------------------------------------------- from types import FunctionType from zope.interface import Interface, implements class IMultiEngineParallelDecorator(Interface): """A decorator that creates a parallel function.""" def parallel(dist='b', targets=None, block=None): """ A decorator that turns a function into a parallel function. This can be used as: @parallel() def f(x, y) ... f(range(10), range(10)) This causes f(0,0), f(1,1), ... to be called in parallel. :Parameters: dist : str What decomposition to use, 'b' is the only one supported currently targets : str, int, sequence of ints Which engines to use for the map block : boolean Should calls to `map` block or not """ class ITaskParallelDecorator(Interface): """A decorator that creates a parallel function.""" def parallel(clear_before=False, clear_after=False, retries=0, recovery_task=None, depend=None, block=True): """ A decorator that turns a function into a parallel function. This can be used as: @parallel() def f(x, y) ... f(range(10), range(10)) This causes f(0,0), f(1,1), ... to be called in parallel. See the documentation for `IPython.kernel.task.BaseTask` for documentation on the arguments to this method. """ class IParallelFunction(Interface): pass class ParallelFunction(object): """ The implementation of a parallel function. A parallel function is similar to Python's map function: map(func, *sequences) -> pfunc(*sequences) Parallel functions should be created by using the @parallel decorator. """ implements(IParallelFunction) def __init__(self, mapper): """ Create a parallel function from an `IMapper`. :Parameters: mapper : an `IMapper` implementer. The mapper to use for the parallel function """ self.mapper = mapper def __call__(self, func): """ Decorate a function to make it run in parallel. """ assert isinstance(func, (str, FunctionType)), "func must be a fuction or str" self.func = func def call_function(*sequences): return self.mapper.map(self.func, *sequences) return call_function