##// END OF EJS Templates
simplify completer logic as we don't exec on behalf of cell...
simplify completer logic as we don't exec on behalf of cell also skip making kernel completion request if kernel is busy

File last commit:

r7052:527525b2
r7174:4297ebc1
Show More
parallelmagic.py
343 lines | 10.4 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``
MinRK
cleanup parallel magics...
r7023 {AUTOPX_DOC}
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888 ``%px``
MinRK
cleanup parallel magics...
r7023 {PX_DOC}
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888
``%result``
MinRK
cleanup parallel magics...
r7023 {RESULT_DOC}
Pauli Virtanen
DOC: extensions: add documentation for the bundled extensions
r4888
"""
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
MinRK
cleanup parallel magics...
r7023 from IPython.core.error import UsageError
MinRK
split `%px` and `%%parallel` line/cell magics
r7045 from IPython.core.magic import Magics, magics_class, line_magic, cell_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
cleanup parallel magics...
r7023
NO_ACTIVE_VIEW = "Use activate() on a DirectView object to use it with 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.
"""
MinRK
restore %result functionality...
r7027
MinRK
cleanup parallel magics...
r7023 # A flag showing if autopx is activated or not
_autopx = False
# the current view used by the magics:
active_view = None
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 result(self, parameter_s=''):
MinRK
add AsyncResult.display_outputs...
r7040 """Print the result of command i on all engines.
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
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.
MinRK
restore %result functionality...
r7027
This lets you recall the results of %px computations after
asynchronous submission (view.block=False).
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
Then you can do the following::
MinRK
restore %result functionality...
r7027 In [23]: %px os.getpid()
Async parallel execution on engine(s): all
MinRK
cleanup parallel magics...
r7023
MinRK
restore %result functionality...
r7027 In [24]: %result
[ 8] Out[10]: 60920
[ 9] Out[10]: 60921
[10] Out[10]: 60922
[11] Out[10]: 60923
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """
MinRK
restore %result functionality...
r7027
MinRK
update parallel_magic for Views...
r3689 if self.active_view is None:
MinRK
cleanup parallel magics...
r7023 raise UsageError(NO_ACTIVE_VIEW)
MinRK
restore %result functionality...
r7027
stride = len(self.active_view)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 try:
index = int(parameter_s)
except:
MinRK
restore %result functionality...
r7027 index = -1
msg_ids = self.active_view.history[stride * index:(stride * (index + 1)) or None]
result = self.active_view.get_result(msg_ids)
result.get()
MinRK
add AsyncResult.display_outputs...
r7040 result.display_outputs()
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
MinRK
split `%px` and `%%parallel` line/cell magics
r7045 @line_magic
def px(self, parameter_s=''):
"""Executes the given python command in parallel.
To use this a :class:`DirectView` instance must be created
and then activated by calling its :meth:`activate` method.
Then you can do the following::
In [24]: %px a = os.getpid()
Parallel execution on engine(s): all
In [25]: %px print a
[stdout:0] 1234
[stdout:1] 1235
[stdout:2] 1236
[stdout:3] 1237
"""
return self.parallel_execute(parameter_s)
def parallel_execute(self, cell, block=None, groupby='type'):
"""implementation used by %px and %%parallel"""
if self.active_view is None:
raise UsageError(NO_ACTIVE_VIEW)
# defaults:
block = self.active_view.block if block is None else block
base = "Parallel" if block else "Async parallel"
print base + " execution on engine(s): %s" % self.active_view.targets
result = self.active_view.execute(cell, silent=False, block=False)
if block:
result.get()
result.display_outputs(groupby)
MinRK
return AsyncResult on nonblocking %px
r7051 else:
# return AsyncResult only on non-blocking submission
return result
MinRK
split `%px` and `%%parallel` line/cell magics
r7045
@skip_doctest
MinRK
parallel cell magic is now `%%px`
r7050 @cell_magic('px')
def cell_px(self, line='', cell=None):
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """Executes the given python command in parallel.
MinRK
add %%px options to docstring
r7043
Cell magic usage:
%%px [-o] [-e] [--group-options=type|engine|order] [--[no]block]
Options (%%px cell magic only):
-o: collate outputs in oder (same as group-outputs=order)
-e: group outputs by engine (same as group-outputs=engine)
--group-outputs=type [default behavior]:
each output type (stdout, stderr, displaypub) for all engines
displayed together.
--group-outputs=order:
The same as 'type', but individual displaypub outputs (e.g. plots)
will be interleaved, so it will display all of the first plots,
then all of the second plots, etc.
--group-outputs=engine:
All of an engine's output is displayed before moving on to the next.
--[no]block:
Whether or not to block for the execution to complete
(and display the results). If unspecified, the active view's
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::
MinRK
split `%px` and `%%parallel` line/cell magics
r7045 In [24]: %%parallel --noblock a = os.getpid()
Async parallel execution on engine(s): all
MinRK
cleanup parallel magics...
r7023
In [25]: %px print a
[stdout:0] 1234
[stdout:1] 1235
[stdout:2] 1236
[stdout:3] 1237
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 """
MinRK
restore %result functionality...
r7027
MinRK
split `%px` and `%%parallel` line/cell magics
r7045 block = None
MinRK
add `%%px` cell magic
r7042 groupby = 'type'
MinRK
split `%px` and `%%parallel` line/cell magics
r7045 # as a cell magic, we accept args
opts, _ = self.parse_options(line, 'oe', 'group-outputs=', 'block', 'noblock')
if 'group-outputs' in opts:
groupby = opts['group-outputs']
elif 'o' in opts:
groupby = 'order'
elif 'e' in opts:
groupby = 'engine'
MinRK
add `%%px` cell magic
r7042
MinRK
split `%px` and `%%parallel` line/cell magics
r7045 if 'block' in opts:
block = True
elif 'noblock' in opts:
block = False
MinRK
add `%%px` cell magic
r7042
MinRK
split `%px` and `%%parallel` line/cell magics
r7045 return self.parallel_execute(cell, block=block, groupby=groupby)
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
"""
MinRK
cleanup parallel magics...
r7023 if self._autopx:
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 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:
MinRK
cleanup parallel magics...
r7023 raise UsageError(NO_ACTIVE_VIEW)
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312
MinRK
cleanup parallel magics...
r7023 # override run_cell
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
MinRK
cleanup parallel magics...
r7023 self._autopx = True
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 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 """
MinRK
cleanup parallel magics...
r7023 if self._autopx:
MinRK
update parallel_magic for Views...
r3689 self.shell.run_cell = self._original_run_cell
MinRK
cleanup parallel magics...
r7023 self._autopx = False
Brian Granger
Parallel magics (%result, %px, %autopx) are fixed....
r2312 print "%autopx disabled"
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:
MinRK
during `%autopx` call display_outputs inside builtin_trap...
r7052 with ipself.builtin_trap:
result.display_outputs()
MinRK
add tests for parallel magics...
r3736 return False
MinRK
fix %autopx in scripts by calling run_code for each ast node...
r3735
MinRK
cleanup parallel magics...
r7023 __doc__ = __doc__.format(
AUTOPX_DOC = ' '*8 + ParallelMagics.autopx.__doc__,
PX_DOC = ' '*8 + ParallelMagics.px.__doc__,
RESULT_DOC = ' '*8 + 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