##// END OF EJS Templates
Cleaned up embedded shell and added cleanup method to InteractiveShell....
Cleaned up embedded shell and added cleanup method to InteractiveShell. * Added explicit code in InteractiveShell to make sure it cleans itself up. This is now done by the single method .cleanup, that can be called to have InteractiveShell cleanup. We can't use __del__ because of the many cycles in our object graph. * The embedded shell is refactored to no embedding logic is in the base class. Thus, InteractiveShell no longer takes an ``embedded`` argument. Just use InteractiveShellEmbed. * Created a super simple top-level :func:`embed` function that creates an InteractiveShellEmbed and calls it.

File last commit:

r1395:1feaf0a3
r2226:7053ea2c
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