parallelfunction.py
106 lines
| 3.1 KiB
| text/x-python
|
PythonLexer
Brian E Granger
|
r1234 | # 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 | |||
Brian E Granger
|
r1346 | from zope.interface import Interface, implements | |
Brian E Granger
|
r1234 | ||
Brian E Granger
|
r1346 | ||
Brian E Granger
|
r1395 | 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 | |||
Brian E Granger
|
r1346 | class ParallelFunction(object): | |
""" | |||
Brian E Granger
|
r1395 | 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. | |||
Brian E Granger
|
r1346 | """ | |
Brian E Granger
|
r1395 | implements(IParallelFunction) | |
def __init__(self, mapper): | |||
Brian E Granger
|
r1346 | """ | |
Brian E Granger
|
r1395 | Create a parallel function from an `IMapper`. | |
:Parameters: | |||
mapper : an `IMapper` implementer. | |||
The mapper to use for the parallel function | |||
Brian E Granger
|
r1234 | """ | |
Brian E Granger
|
r1395 | self.mapper = mapper | |
Brian E Granger
|
r1234 | ||
Brian E Granger
|
r1346 | def __call__(self, func): | |
""" | |||
Brian E Granger
|
r1395 | Decorate a function to make it run in parallel. | |
Brian E Granger
|
r1346 | """ | |
assert isinstance(func, (str, FunctionType)), "func must be a fuction or str" | |||
self.func = func | |||
def call_function(*sequences): | |||
Brian E Granger
|
r1395 | return self.mapper.map(self.func, *sequences) | |
Brian E Granger
|
r1346 | return call_function | |