##// END OF EJS Templates
Initial refactor of task dependency system....
Initial refactor of task dependency system. We are thinking about refactoring the task dependency system. Currently is is based on engine properties and a function sent with each task. In this commit, I have added a TaskRejectError that tasks can raise to indicate that the engine doesn't have the required dependencies. For now I have not removed any of the old stuff, but I have added warnings that we might remove the older *_prop* methods in IMultiEngine. See this ticket for more info: https://bugs.launchpad.net/bugs/361419

File last commit:

r1395:1feaf0a3
r1952:d68cab7f
Show More
parallelfunction.py
106 lines | 3.1 KiB | text/x-python | PythonLexer
# 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