##// END OF EJS Templates
Renamed @register_magics to @magics_class to avoid confusion....
Renamed @register_magics to @magics_class to avoid confusion. The main ipython object also has a .register_magics method that must often be used in close proximity to the class decorator, yet does something completely different. Having these two objects with the same name yet different purposes was proving to be quite confusing in my testing usage so far.

File last commit:

r6973:1f1d8fa1
r6973:1f1d8fa1
Show More
parallelmagic.py
316 lines | 9.6 KiB | text/x-python | PythonLexer
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 # encoding: utf-8
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 """
=============
parallelmagic
=============
Magic command interface for interactive parallel work.
Usage
=====
``%autopx``
@AUTOPX_DOC@
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 ``%px``
@PX_DOC@
``%result``
@RESULT_DOC@
"""
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
#-----------------------------------------------------------------------------
Fernando Perez
Simplify parallelmagics by removing unnecessary plugin.
r6955 # Copyright (C) 2008 The IPython Development Team
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 #
# Distributed under the terms of the BSD License. The full license is in
# the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------
#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------
MinRK
update parallel_magic for Views...
r3689 import ast
import re
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Fernando Perez
Renamed @register_magics to @magics_class to avoid confusion....
r6973 from IPython.core.magic import Magics, magics_class, line_magic
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 from IPython.testing.skipdoctest import skip_doctest
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
#-----------------------------------------------------------------------------
# Definitions of magic functions for use with IPython
#-----------------------------------------------------------------------------
MinRK
update parallel_magic for Views...
r3689 NO_ACTIVE_VIEW = """
Use activate() on a DirectView object to activate it for magics.
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """
Fernando Perez
Renamed @register_magics to @magics_class to avoid confusion....
r6973 @magics_class
Fernando Perez
Update parallelmagics to new magic API.
r6939 class ParallelMagics(Magics):
"""A set of magics useful when controlling a parallel IPython cluster.
"""
Fernando Perez
Simplify parallelmagics by removing unnecessary plugin.
r6955
Fernando Perez
Update parallelmagics to new magic API.
r6939 def __init__(self, shell):
super(ParallelMagics, self).__init__(shell)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 # A flag showing if autopx is activated or not
self.autopx = False
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 @skip_doctest
Fernando Perez
Update parallelmagics to new magic API.
r6939 @line_magic
def result(self, parameter_s=''):
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """Print the result of command i on all engines..
Bernardo B. Marques
remove all trailling spaces
r4872 To use this a :class:`DirectView` instance must be created
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 and then activated by calling its :meth:`activate` method.
Then you can do the following::
In [23]: %result
Bernardo B. Marques
remove all trailling spaces
r4872 Out[23]:
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 <Results List>
[0] In [6]: a = 10
[1] In [6]: a = 10
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 In [22]: %result 6
Bernardo B. Marques
remove all trailling spaces
r4872 Out[22]:
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 <Results List>
[0] In [6]: a = 10
[1] In [6]: a = 10
"""
MinRK
update parallel_magic for Views...
r3689 if self.active_view is None:
print NO_ACTIVE_VIEW
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return
try:
index = int(parameter_s)
except:
index = None
MinRK
update parallel_magic for Views...
r3689 result = self.active_view.get_result(index)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return result
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 @skip_doctest
Fernando Perez
Update parallelmagics to new magic API.
r6939 @line_magic
def px(self, parameter_s=''):
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """Executes the given python command in parallel.
Bernardo B. Marques
remove all trailling spaces
r4872 To use this a :class:`DirectView` instance must be created
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 and then activated by calling its :meth:`activate` method.
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 Then you can do the following::
In [24]: %px a = 5
MinRK
fix %px magic output for single target...
r3997 Parallel execution on engine(s): all
Bernardo B. Marques
remove all trailling spaces
r4872 Out[24]:
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 <Results List>
[0] In [7]: a = 5
[1] In [7]: a = 5
"""
MinRK
update parallel_magic for Views...
r3689 if self.active_view is None:
print NO_ACTIVE_VIEW
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return
MinRK
fix %px magic output for single target...
r3997 print "Parallel execution on engine(s): %s" % self.active_view.targets
MinRK
add tests for parallel magics...
r3736 result = self.active_view.execute(parameter_s, block=False)
if self.active_view.block:
result.get()
self._maybe_display_output(result)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Thomas Kluyver
Move skip_doctest decorator to separate module, so that it can be used without triggering other imports.
r3886 @skip_doctest
Fernando Perez
Update parallelmagics to new magic API.
r6939 @line_magic
def autopx(self, parameter_s=''):
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """Toggles auto parallel mode.
Bernardo B. Marques
remove all trailling spaces
r4872 To use this a :class:`DirectView` instance must be created
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 and then activated by calling its :meth:`activate` method. Once this
is called, all commands typed at the command line are send to
the engines to be executed in parallel. To control which engine
are used, set the ``targets`` attributed of the multiengine client
before entering ``%autopx`` mode.
Then you can do the following::
In [25]: %autopx
%autopx to enabled
In [26]: a = 10
MinRK
fix %px magic output for single target...
r3997 Parallel execution on engine(s): [0,1,2,3]
MinRK
add tests for parallel magics...
r3736 In [27]: print a
MinRK
fix %px magic output for single target...
r3997 Parallel execution on engine(s): [0,1,2,3]
MinRK
add tests for parallel magics...
r3736 [stdout:0] 10
[stdout:1] 10
[stdout:2] 10
[stdout:3] 10
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
In [27]: %autopx
%autopx disabled
"""
if self.autopx:
self._disable_autopx()
else:
self._enable_autopx()
def _enable_autopx(self):
Bernardo B. Marques
remove all trailling spaces
r4872 """Enable %autopx mode by saving the original run_cell and installing
MinRK
update parallel_magic for Views...
r3689 pxrun_cell.
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """
MinRK
update parallel_magic for Views...
r3689 if self.active_view is None:
print NO_ACTIVE_VIEW
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 # override run_cell and run_code
MinRK
update parallel_magic for Views...
r3689 self._original_run_cell = self.shell.run_cell
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 self.shell.run_cell = self.pxrun_cell
self._original_run_code = self.shell.run_code
self.shell.run_code = self.pxrun_code
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 self.autopx = True
print "%autopx enabled"
Bernardo B. Marques
remove all trailling spaces
r4872
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 def _disable_autopx(self):
MinRK
update parallel_magic for Views...
r3689 """Disable %autopx by restoring the original InteractiveShell.run_cell.
Fernando Perez
Update many names to pep-8: savehist -> save_hist....
r3096 """
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 if self.autopx:
MinRK
update parallel_magic for Views...
r3689 self.shell.run_cell = self._original_run_cell
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 self.shell.run_code = self._original_run_code
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 self.autopx = False
print "%autopx disabled"
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 def _maybe_display_output(self, result):
"""Maybe display the output of a parallel result.
If self.active_view.block is True, wait for the result
and display the result. Otherwise, this is a noop.
"""
MinRK
fix %px magic output for single target...
r3997 if isinstance(result.stdout, basestring):
# single result
stdouts = [result.stdout.rstrip()]
else:
stdouts = [s.rstrip() for s in result.stdout]
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
add tests for parallel magics...
r3736 targets = self.active_view.targets
if isinstance(targets, int):
targets = [targets]
MinRK
fix %px magic output for single target...
r3997 elif targets == 'all':
MinRK
add tests for parallel magics...
r3736 targets = self.active_view.client.ids
MinRK
fix %px magic output for single target...
r3997
if any(stdouts):
for eid,stdout in zip(targets, stdouts):
print '[stdout:%i]'%eid, stdout
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
MinRK
fix run_cell signature in parallelmagic...
r6878 def pxrun_cell(self, raw_cell, store_history=False, silent=False):
MinRK
update parallel_magic for Views...
r3689 """drop-in replacement for InteractiveShell.run_cell.
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 This executes code remotely, instead of in the local namespace.
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
See InteractiveShell.run_cell for details.
MinRK
update parallel_magic for Views...
r3689 """
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738 if (not raw_cell) or raw_cell.isspace():
return
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 ipself = self.shell
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 with ipself.builtin_trap:
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738 cell = ipself.prefilter_manager.prefilter_lines(raw_cell)
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 # Store raw and processed history
if store_history:
Bernardo B. Marques
remove all trailling spaces
r4872 ipself.history_manager.store_inputs(ipself.execution_count,
MinRK
update parallel_magic for Views...
r3689 cell, raw_cell)
Brian Granger
Updating IPython.kernel to fix minor bugs....
r3239
MinRK
update parallel_magic for Views...
r3689 # ipself.logger.log(cell, raw_cell)
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 cell_name = ipself.compile.cache(cell, ipself.execution_count)
Bernardo B. Marques
remove all trailling spaces
r4872
MinRK
update parallel_magic for Views...
r3689 try:
Fernando Perez
Simplify parallelmagics by removing unnecessary plugin.
r6955 ast.parse(cell, filename=cell_name)
except (OverflowError, SyntaxError, ValueError, TypeError,
MemoryError):
MinRK
update parallel_magic for Views...
r3689 # Case 1
ipself.showsyntaxerror()
ipself.execution_count += 1
return None
except NameError:
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 # ignore name errors, because we don't know the remote keys
MinRK
update parallel_magic for Views...
r3689 pass
if store_history:
# Write output to the database. Does nothing unless
# history output logging is enabled.
ipself.history_manager.store_output(ipself.execution_count)
# Each cell is a *single* input, regardless of how many lines it has
ipself.execution_count += 1
MinRK
fix autopx regex after recent change...
r5364 if re.search(r'get_ipython\(\)\.magic\(u?["\']%?autopx', cell):
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 self._disable_autopx()
return False
else:
try:
MinRK
fix run_cell signature in parallelmagic...
r6878 result = self.active_view.execute(cell, silent=False, block=False)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 except:
ipself.showtraceback()
MinRK
add tests for parallel magics...
r3736 return True
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 else:
MinRK
add tests for parallel magics...
r3736 if self.active_view.block:
try:
result.get()
except:
self.shell.showtraceback()
return True
else:
self._maybe_display_output(result)
return False
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
MinRK
update parallel %autopx magics to reflect recent changes in run_cell, run_code
r3738 def pxrun_code(self, code_obj):
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 """drop-in replacement for InteractiveShell.run_code.
This executes code remotely, instead of in the local namespace.
See InteractiveShell.run_code for details.
"""
ipself = self.shell
# check code object for the autopx magic
Fernando Perez
Update parallelmagics to new magic API.
r6939 if 'get_ipython' in code_obj.co_names and 'magic' in code_obj.co_names \
and any( [ isinstance(c, basestring) and 'autopx' in c
for c in code_obj.co_consts ]):
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 self._disable_autopx()
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 return False
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 else:
try:
result = self.active_view.execute(code_obj, block=False)
except:
ipself.showtraceback()
MinRK
add tests for parallel magics...
r3736 return True
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735 else:
MinRK
add tests for parallel magics...
r3736 if self.active_view.block:
try:
result.get()
except:
self.shell.showtraceback()
return True
else:
self._maybe_display_output(result)
return False
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 __doc__ = __doc__.replace('@AUTOPX_DOC@',
Fernando Perez
Fix invalid attribute access in parallelmagic
r6946 " " + ParallelMagics.autopx.__doc__)
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 __doc__ = __doc__.replace('@PX_DOC@',
Fernando Perez
Fix invalid attribute access in parallelmagic
r6946 " " + ParallelMagics.px.__doc__)
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 __doc__ = __doc__.replace('@RESULT_DOC@',
Fernando Perez
Fix invalid attribute access in parallelmagic
r6946 " " + ParallelMagics.result.__doc__)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
_loaded = False
def load_ipython_extension(ip):
"""Load the extension in IPython."""
global _loaded
if not _loaded:
Fernando Perez
Simplify parallelmagics by removing unnecessary plugin.
r6955 ip.register_magics(ParallelMagics)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 _loaded = True