<br><br><div class="gmail_quote">On Sat, Aug 6, 2011 at 15:41, Maarten Derickx <span dir="ltr">&lt;<a href="mailto:m.derickx.student@gmail.com">m.derickx.student@gmail.com</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">

I was just trying to turn some ideas I had for parallelizing code into<br>
reality using the new IPython parallel interface. During this I ran<br>
into some questions.<br>
<br>
1.  I want to stop already running calculations (and I don&#39;t know at<br>
the time that I start the computation if I want to abort it or after<br>
how long I want to abort it so I cannot use timouts). But as far as I<br>
see IPython can only abort calculations which are queued, but not yet<br>
running. See<br>
<a href="http://pastebin.com/VZTU9bR7" target="_blank">http://pastebin.com/VZTU9bR7</a><br>
for an example where I use .abort on an asynchronous result on an<br>
already running job.<br>
I wonder if it&#39;s possible to stop already running jobs. I know it&#39;s</blockquote><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
possible to shutdown engines even when they have a job, but then you<br>
have to be able to start new ones which brings me to<br><br></blockquote><div><div><br class="Apple-interchange-newline">Not presently.  shutdown is handled as a regular Control message, so it will</div><div>wait for the current execution to finish before it is noticed.  We do hope to add</div>

<div>interrupt, etc. support, but that will require running another process adjacent to the engine</div><div>that intercepts control messages.  Far from impossible, but made more difficult by MPI</div><div>restrictions that require the work-process be the first one started, so the Engine has</div>

<div>to start what is essentially its parent as its child. It also has to be optional, to allow the</div><div>Engines to be run in draconian cluster environments that don&#39;t allow extra processes.</div><div><br></div>
<div>
For now, if you are running engines locally, you can send interrupts from the client.</div></div><div><br></div><div>Just do this, first thing:</div><div><br></div><div>pids = rc[:].apply_async(os.getpid).get_dict()</div>

<div># {0: 48388, 1: 48386, 2: 48387, 3: 48385} </div><div><br></div><div>Then when you want to interrupt a running calculation, just do:</div><div><br></div><div>os.kill(pids[engine_id], signal.SIGINT)</div><div><br></div>

<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
2. The second thing I was wondering about and could not find in the<br>
documentation, is if there is an easy way to do something equivalent<br>
to &quot;ipcluster start --n=4&quot; and &quot;ipengine&quot; in python?<br></blockquote><div><br></div><div>Well, there&#39;s always `os.system(&quot;ipengine&quot;)` :)</div><div><br></div><div>But in all seriousness, you can use the Launchers that ipcluster itself uses:</div>

<div><br></div><div>from IPython.parallel.apps import launcher</div><div><br></div><div>el = launcher.LocalEngineLauncher()</div><div>el.start(&quot;/Users/you/.ipython/profile_default&quot;)</div><div><br></div><div>(start takes a profile_dir as an option, so pass whatever makes sense.  The default behavior would be `IPYTHON_DIR/profile_default`.)</div>

<div><br></div><div>And there&#39;s EngineSetLaunchers for launching more than one, MPI launchers for using MPIExec, SGE, PBS, etc.</div><div><br></div><div>`ipcluster start` just starts one ControllerLauncher and one EngineSetLauncher. `ipcluster engines` is the same, but skips the Controller.</div>

<div><br></div><div>These are very simple wrappers for subprocess.Popen.</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
3. I found the following session quite unexpected, see<br>
<a href="http://pastebin.com/EkxAArSw" target="_blank">http://pastebin.com/EkxAArSw</a><br>
The cluster was started with &quot;ipcluster start --n=4&quot; then I shot down<br>
an engine while it was doing a computation and after that I cannot<br>
start new computations<br>
note that  c.shutdown(0) was done more that 10 seconds after the<br>
previous command and that  c.shutdown(1) was done less then 10 seconds<br>
after the previous command. The error in &quot;In [34]&quot; is ok, but the two<br>
error&#39;s in &quot;In [35]&quot; and &quot;In [36]&quot; should not happen I guess.<br></blockquote><div><br></div><div>There&#39;s definitely a bug, but there is an issue with your code.  A DirectView&#39;s targets attribute is set at the time of construction.  So:</div>

<div><br></div><div>dv = rc[:]</div><div><br></div><div>gets a DirectView with all of the engines that are attached *at the time of the call*.  It is not a lazily evaluated &#39;all targets&#39;, which follows engines coming and going.  That means that executions from dv after one of its targets is gone will still try to run in the dead location, and you need to update the targets of dv, or create a new view.</div>

<div><br></div><div>If you do set dv.targets=&#39;all&#39;, then it will be lazily evaluated at each execution, and kept up to date.  rc.direct_view(&#39;all&#39;) *should* do this, but it doesn&#39;t*</div><div><br></div>

<div>* it does now, as of a minute ago.</div><div><br></div><div>-MinRK</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
_______________________________________________<br>
IPython-User mailing list<br>
<a href="mailto:IPython-User@scipy.org">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>
</blockquote></div><br>