Show More
@@ -0,0 +1,189 b'' | |||||
|
1 | #!/usr/bin/env python | |||
|
2 | # encoding: utf-8 | |||
|
3 | ||||
|
4 | """Magic command interface for interactive parallel work.""" | |||
|
5 | ||||
|
6 | #----------------------------------------------------------------------------- | |||
|
7 | # Copyright (C) 2008-2009 The IPython Development Team | |||
|
8 | # | |||
|
9 | # Distributed under the terms of the BSD License. The full license is in | |||
|
10 | # the file COPYING, distributed as part of this software. | |||
|
11 | #----------------------------------------------------------------------------- | |||
|
12 | ||||
|
13 | #----------------------------------------------------------------------------- | |||
|
14 | # Imports | |||
|
15 | #----------------------------------------------------------------------------- | |||
|
16 | ||||
|
17 | from IPython.core.component import Component | |||
|
18 | from IPython.utils.traitlets import Bool, Any | |||
|
19 | from IPython.utils.autoattr import auto_attr | |||
|
20 | ||||
|
21 | ||||
|
22 | #------------------------------------------------------------------------------- | |||
|
23 | # Definitions of magic functions for use with IPython | |||
|
24 | #------------------------------------------------------------------------------- | |||
|
25 | ||||
|
26 | NO_ACTIVE_MULTIENGINE_CLIENT = """ | |||
|
27 | Error: No Controller is activated | |||
|
28 | Use activate() on a MultiEngineClient object to activate it for magics. | |||
|
29 | """ | |||
|
30 | ||||
|
31 | ||||
|
32 | class ParalleMagicComponent(Component): | |||
|
33 | ||||
|
34 | active_multiengine_client = Any() | |||
|
35 | verbose = Bool(False, config=True) | |||
|
36 | ||||
|
37 | def __init__(self, parent, name=None, config=None): | |||
|
38 | super(ParalleMagicComponent, self).__init__(parent, name=name, config=config) | |||
|
39 | self._define_magics() | |||
|
40 | ||||
|
41 | # Access other components like this rather than by a regular attribute. | |||
|
42 | # This won't lookup the InteractiveShell object until it is used and | |||
|
43 | # then it is cached. This is both efficient and couples this class | |||
|
44 | # more loosely to InteractiveShell. | |||
|
45 | @auto_attr | |||
|
46 | def shell(self): | |||
|
47 | return Component.get_instances( | |||
|
48 | root=self.root, | |||
|
49 | klass='IPython.core.iplib.InteractiveShell')[0] | |||
|
50 | ||||
|
51 | def _define_magics(self): | |||
|
52 | self.shell.define_magic('result', self.magic_result) | |||
|
53 | self.shell.define_magic('px', self.magic_px) | |||
|
54 | self.shell.define_magic('autopx', self.magix_autopx) | |||
|
55 | ||||
|
56 | def magic_result(self, ipself, parameter_s=''): | |||
|
57 | """Print the result of command i on all engines of the active controller. | |||
|
58 | ||||
|
59 | To activate a controller in IPython, first create it and then call | |||
|
60 | the activate() method. | |||
|
61 | ||||
|
62 | Then you can do the following: | |||
|
63 | ||||
|
64 | >>> result # Print the latest result | |||
|
65 | Printing result... | |||
|
66 | [127.0.0.1:0] In [1]: b = 10 | |||
|
67 | [127.0.0.1:1] In [1]: b = 10 | |||
|
68 | ||||
|
69 | >>> result 0 # Print result 0 | |||
|
70 | In [14]: result 0 | |||
|
71 | Printing result... | |||
|
72 | [127.0.0.1:0] In [0]: a = 5 | |||
|
73 | [127.0.0.1:1] In [0]: a = 5 | |||
|
74 | """ | |||
|
75 | if self.active_multiengine_client is None: | |||
|
76 | print NO_ACTIVE_MULTIENGINE_CLIENT | |||
|
77 | return | |||
|
78 | ||||
|
79 | try: | |||
|
80 | index = int(parameter_s) | |||
|
81 | except: | |||
|
82 | index = None | |||
|
83 | result = self.active_multiengine_client.get_result(index) | |||
|
84 | return result | |||
|
85 | ||||
|
86 | # def magic_px(self,parameter_s=''): | |||
|
87 | # """Executes the given python command on the active IPython Controller. | |||
|
88 | # | |||
|
89 | # To activate a Controller in IPython, first create it and then call | |||
|
90 | # the activate() method. | |||
|
91 | # | |||
|
92 | # Then you can do the following: | |||
|
93 | # | |||
|
94 | # >>> %px a = 5 # Runs a = 5 on all nodes | |||
|
95 | # """ | |||
|
96 | # | |||
|
97 | # try: | |||
|
98 | # activeController = __IPYTHON__.activeController | |||
|
99 | # except AttributeError: | |||
|
100 | # print NO_ACTIVE_CONTROLLER | |||
|
101 | # else: | |||
|
102 | # print "Parallel execution on engines: %s" % activeController.targets | |||
|
103 | # result = activeController.execute(parameter_s) | |||
|
104 | # return result | |||
|
105 | # | |||
|
106 | # def pxrunsource(self, source, filename="<input>", symbol="single"): | |||
|
107 | # | |||
|
108 | # try: | |||
|
109 | # code = self.compile(source, filename, symbol) | |||
|
110 | # except (OverflowError, SyntaxError, ValueError): | |||
|
111 | # # Case 1 | |||
|
112 | # self.showsyntaxerror(filename) | |||
|
113 | # return None | |||
|
114 | # | |||
|
115 | # if code is None: | |||
|
116 | # # Case 2 | |||
|
117 | # return True | |||
|
118 | # | |||
|
119 | # # Case 3 | |||
|
120 | # # Because autopx is enabled, we now call executeAll or disable autopx if | |||
|
121 | # # %autopx or autopx has been called | |||
|
122 | # if 'get_ipython().magic("%autopx' in source or 'get_ipython().magic("autopx' in source: | |||
|
123 | # _disable_autopx(self) | |||
|
124 | # return False | |||
|
125 | # else: | |||
|
126 | # try: | |||
|
127 | # result = self.activeController.execute(source) | |||
|
128 | # except: | |||
|
129 | # self.showtraceback() | |||
|
130 | # else: | |||
|
131 | # print result.__repr__() | |||
|
132 | # return False | |||
|
133 | # | |||
|
134 | # def magic_autopx(self, parameter_s=''): | |||
|
135 | # """Toggles auto parallel mode for the active IPython Controller. | |||
|
136 | # | |||
|
137 | # To activate a Controller in IPython, first create it and then call | |||
|
138 | # the activate() method. | |||
|
139 | # | |||
|
140 | # Then you can do the following: | |||
|
141 | # | |||
|
142 | # >>> %autopx # Now all commands are executed in parallel | |||
|
143 | # Auto Parallel Enabled | |||
|
144 | # Type %autopx to disable | |||
|
145 | # ... | |||
|
146 | # >>> %autopx # Now all commands are locally executed | |||
|
147 | # Auto Parallel Disabled | |||
|
148 | # """ | |||
|
149 | # | |||
|
150 | # if hasattr(self, 'autopx'): | |||
|
151 | # if self.autopx == True: | |||
|
152 | # _disable_autopx(self) | |||
|
153 | # else: | |||
|
154 | # _enable_autopx(self) | |||
|
155 | # else: | |||
|
156 | # _enable_autopx(self) | |||
|
157 | # | |||
|
158 | # def _enable_autopx(self): | |||
|
159 | # """Enable %autopx mode by saving the original runsource and installing | |||
|
160 | # pxrunsource. | |||
|
161 | # """ | |||
|
162 | # try: | |||
|
163 | # activeController = __IPYTHON__.activeController | |||
|
164 | # except AttributeError: | |||
|
165 | # print "No active RemoteController found, use RemoteController.activate()." | |||
|
166 | # else: | |||
|
167 | # self._original_runsource = self.runsource | |||
|
168 | # self.runsource = new.instancemethod(pxrunsource, self, self.__class__) | |||
|
169 | # self.autopx = True | |||
|
170 | # print "Auto Parallel Enabled\nType %autopx to disable" | |||
|
171 | # | |||
|
172 | # def _disable_autopx(self): | |||
|
173 | # """Disable %autopx by restoring the original runsource.""" | |||
|
174 | # if hasattr(self, 'autopx'): | |||
|
175 | # if self.autopx == True: | |||
|
176 | # self.runsource = self._original_runsource | |||
|
177 | # self.autopx = False | |||
|
178 | # print "Auto Parallel Disabled" | |||
|
179 | ||||
|
180 | ||||
|
181 | _loaded = False | |||
|
182 | ||||
|
183 | def load_ipython_extension(ip): | |||
|
184 | """Load the extension in IPython as a hook.""" | |||
|
185 | global _loaded | |||
|
186 | if not _loaded: | |||
|
187 | prd = ParalleMagicComponent(ip, name='parallel_magic') | |||
|
188 | _loaded = True | |||
|
189 |
1 | NO CONTENT: file was removed |
|
NO CONTENT: file was removed |
General Comments 0
You need to be logged in to leave comments.
Login now