Skip to content

Commit

Permalink
parallel magic: added draft of %pmap (with hack); parallel kernels no…
Browse files Browse the repository at this point in the history
…w a subkernel; magickernel.do_function_direct prototype
  • Loading branch information
dsblank committed Sep 12, 2014
1 parent 564b6f3 commit 543a3cd
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 0 deletions.
7 changes: 7 additions & 0 deletions jupyter_kernel/magickernel.py
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,13 @@ def do_execute_file(self, filename):
"""
self.Error("This language does not support \"%run filename\".")

def do_function_direct(self, function_name, args):
"""
Call a function in the kernel language with args (as a single item).
"""
#self.Error("This language does not support \"%pmap function args\".")
return (function_name, args)

def restart_kernel(self):
"""Restart the kernel"""
pass
Expand Down
19 changes: 19 additions & 0 deletions jupyter_kernel/magics/parallel_magic.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ def __getitem__(self, item):
class ParallelMagic(Magic):
client = None
view = None
view_load_balanced = None
module_name = None
class_name = None
kernel_name = None
Expand Down Expand Up @@ -65,6 +66,7 @@ def line_parallel(self, module_name, class_name, kernel_name="default", ids=None
for item in ids_slice:
view.append(self.client[item])
self.view = view
self.view_load_balanced = self.client.load_balanced_view()
self.module_name = module_name
self.class_name = class_name
self.kernel_name = kernel_name
Expand All @@ -74,6 +76,7 @@ def line_parallel(self, module_name, class_name, kernel_name="default", ids=None
except:
kernels = {}
from %(module_name)s import %(class_name)s
%(class_name)s.subkernel(get_ipython().parent)
kernels['%(kernel_name)s'] = %(class_name)s()
""" % {"module_name": module_name,
"class_name": class_name,
Expand Down Expand Up @@ -145,6 +148,22 @@ def cell_px(self, kernel_name=None, evaluate=False):
kernel_name, self._clean_code(self.code))]
self.evaluate = evaluate

def line_pmap(self, function_name, args, kernel_name=None):
"""
%pmap FUNCTION [ARGS1, ARGS2, ...] - call FUNCTION
"""
if kernel_name is None:
kernel_name = self.kernel_name

# FIXME: horrible hack
self.view.execute("""
import os
os.kernels = kernels
""")
self.retval = self.view_load_balanced.map_async(
lambda arg, kname=kernel_name, fname=function_name: os.kernels[kname].do_function_direct(fname, arg),
eval(args))

def post_process(self, retval):
try:
## any will crash on numpy arrays
Expand Down

0 comments on commit 543a3cd

Please sign in to comment.