<div dir="ltr"><div>2013/1/29 Johann Rohwer <span dir="ltr">&lt;<a href="mailto:jr@sun.ac.za" target="_blank">jr@sun.ac.za</a>&gt;</span></div></div><div class="gmail_extra"><div class="gmail_quote">
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div>On Tuesday 29 January 2013 13:37:34 Florian M. Wagner wrote:<br>
&gt; I am currently trying to parallelize a piece of code using IPython&#39;s<br>
&gt; parallel version of map. It works fine for simple examples, but the<br>
&gt; function I would like to distribute falls back upon some globally<br>
&gt; declared variables, which the engines are not aware of. Is there a<br>
&gt; way to sync the namespace of all engines analogously to<br>
&gt; sync_imports or what would you suggest?<br>
<br>
</div>I&#39;m not aware of whether it is possible to sync the namespaces<br>
completely and whether this useful or feasible at all (do we want the<br>
controller and client objects to be available on all the engines?).<br>
However, you can easily push those global variables the function<br>
requires to all the engines with the dview.push() method.<br>
<br>
Johann<br>
E-pos vrywaringsklousule<br>
<br>
Hierdie e-pos mag vertroulike inligting bevat en mag regtens geprivilegeerd wees en is slegs bedoel vir die persoon aan wie dit geadresseer is. Indien u nie die bedoelde ontvanger is nie, word u hiermee in kennis gestel dat u hierdie dokument geensins mag gebruik, versprei of kopieer nie. Stel ook asseblief die sender onmiddellik per telefoon in kennis en vee die e-pos uit. Die Universiteit aanvaar nie aanspreeklikheid vir enige skade, verlies of uitgawe wat voortspruit uit hierdie e-pos en/of die oopmaak van enige lęs aangeheg by hierdie e-pos nie.<br>



<br>
E-mail disclaimer<br>
<br>
This e-mail may contain confidential information and may be legally privileged and is intended only for the person to whom it is addressed. If you are not the intended recipient, you are notified that you may not use, distribute or copy this document in any manner whatsoever. Kindly also notify the sender immediately by telephone, and delete the e-mail. The University does not accept liability for any damage, loss or expense arising from this e-mail and/or accessing any files attached to this e-mail.<br>



<br>_______________________________________________<br>
IPython-User mailing list<br>
<a href="mailto:IPython-User@scipy.org" target="_blank">IPython-User@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/ipython-user" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-user</a><br>
<br></blockquote></div><div class="gmail_extra"><br></div>Hi Florian,<div><br></div><div>I asked something related a few month ago: my main problem was to `import module as m` and broadcast functions and variables to all the engines. As now that is no automatic way.</div>

<div><br></div><div>So I wrote a class that initialize my parallel environment, and perform a few operations. One of the methods is </div><div><br></div><div><div>    def exec_on_engine( self, code, block=True ):</div><div>

        &quot;&quot;&quot;</div><div>        Execute the given code on all engines </div><div>        </div><div>        Parameters</div><div>        ----------</div><div>        to_execute: string or list of strings </div>

<div>            command(s) to execute on all the nodes. Thought for short tasks,</div><div>            like importing modules</div><div>        block: bool</div><div>            whether or not to wait until done to return. default: True</div>

<div>        &quot;&quot;&quot;</div><div>        if isinstance(code, basestring): # if it&#39;s a string</div><div>            code = [code,]  # convert to list</div><div>        # execute the required commands </div><div>

        # (better to do in block mode, avoids errors if command is slow)</div><div>        for te in code:</div><div>            try:</div><div>                self.dview.execute(te, block=block)  </div><div>            except error.CompositeError, e:  # if an error occurs, print a single one, not one per engine</div>

<div>                e.raise_exception()</div></div><div><br></div><div><br></div><div>I use it roughly as follow (I didn&#39;t test passing a variable, but should work)</div><div><br></div><div>        import os                                                                                             </div>

<div><div>        # absolute path and file name of this script                                                       </div><div>        path, fname = os.path.split(os.path.abspath(sys.argv[0]))                                             </div>

<div>        #command to run on all the engines                                                                    </div><div>        imports = [&#39;import numpy as np&#39;,</div><div>                # add the script directory to the python path                                                  </div>

<div>                &#39;import sys&#39;, &#39;sys.path.append(&quot;{0}&quot;)&#39;.format(path),                                          </div><div>                # import a function from the script in the namespace                                                 </div>

<div>                &#39;from {0} import func&#39;.format(os.path.splitext(fname)[0]),</div><div>                 &#39;a = 10&#39;]</div><div>        parallel_env.exec_on_engine(imports) </div></div><div><br></div><div>
Does it help?</div>
<div><br></div><div>Francesco</div></div>