<br><br><div class="gmail_quote">On Fri, Oct 21, 2011 at 17:57, Toby Burnett <span dir="ltr">&lt;<a href="mailto:tburnett@uw.edu">tburnett@uw.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">







<div lang="EN-US" link="blue" vlink="purple">
<div>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">Thanks for the response! That works nicely, but it seems to wait for each task to finish in the order started, and does not seem provide access to the metadata
 (I want to be able to examine the stdout for each process as it finishes.) Could I set up a callback for finishing tasks with the result and metadata?</span></p></div></div></blockquote><div><br></div><div>Yes, it does iterate in order.  I have unordered iteration working locally, for which I will issue a Pull Request, probably this weekend.</div>

<div><br></div><div>Note that AsyncResults are merely convenient wrappers for results and metadata, they are not the canonical store.  That is the Client itself, which has dictionaries for each, keyed by msg_id.  This allows you to actually watch stdout/stderr for a task without even waiting for that single task to finish.  An important part of the parallel code is that the *only* things you need to get everything about a job are its id and a Client.</div>

<div><br></div><div>If you want to do something with tasks that AsyncResults don&#39;t provide, you can just get their msg_ids attribute (a list of message ID strings), and do what you like with them.</div><div><br></div>

<div>If you would rather have a collection of AsyncResult objects rather than a single AMR, you can do that, with:</div><div><br></div><div>asyncresults = [ rc.get_result(msg_id, block=False) for msg_id in amr.msg_ids ]</div>

<div># which is now a list of individual AsyncResult objects, one for each *chunk* of the AsyncMapResult (no)</div><div><br></div><div>An important thing to note if you do split up an AsyncMapResult is that the individual results will always return a list of length `chunksize`, even if chunksize is 1.</div>

<div><br></div><div>A <a href="https://gist.github.com/1305415">quick example</a> of performing custom handling of results as they arrive (regardless of submission order), including printing stdout and some metadata.</div>

<div><br></div><div>-MinRK</div><div><br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;"><div lang="EN-US" link="blue" vlink="purple"><div><p class="MsoNormal">

<span style="font-size:11.0pt;color:#1F497D"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D">--Toby<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11.0pt;color:#1F497D"><u></u> <u></u></span></p>
<p class="MsoNormal"><b><span style="font-size:10.0pt">From:</span></b><span style="font-size:10.0pt"> MinRK [mailto:<a href="mailto:benjaminrk@gmail.com" target="_blank">benjaminrk@gmail.com</a>]
<br>
<b>Sent:</b> Friday, October 21, 2011 15:18<br>
<b>To:</b> Toby Burnett<br>
<b>Cc:</b> <a href="mailto:ipython-user@scipy.org" target="_blank">ipython-user@scipy.org</a><br>
<b>Subject:</b> Re: [IPython-User] parallel load-balanced question<u></u><u></u></span></p><div><div></div><div class="h5">
<p class="MsoNormal"><u></u> <u></u></p>
<p class="MsoNormal" style="margin-bottom:12.0pt"><u></u> <u></u></p>
<div>
<p class="MsoNormal">On Fri, Oct 21, 2011 at 14:44, Toby Burnett &lt;<a href="mailto:tburnett@uw.edu" target="_blank">tburnett@uw.edu</a>&gt; wrote:<u></u><u></u></p>
<div>
<div>
<p class="MsoNormal">Hi, I’m converting to the new parallel scheme, very nice.<u></u><u></u></p>
<p class="MsoNormal">I start a number of tasks with the lview.map, and would like to be able to extract some results from finished tasks before they all finish. The AsyncMapResult object does not seem
 to allow that, however. It is a list with an entry for each task, but no way that I could find to get the metadata for a finished task before all had finished. Am I missing something? Doing this the wrong way?<u></u><u></u></p>


</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">AsyncMapResult is *iterable* before everything is done, but you can&#39;t do index-access until they are all done:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">amr = view.map(myfunc, myargs)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">for result in amr:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    dostuff(result) # this is the actual return value of myfunc(myargs[i])<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">Or, for a full toy example, load-balanced, super-slow RMS with intermediate status updates:<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">from random import random<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">from IPython import parallel<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">rc = parallel.Client()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">v = rc.load_balanced_view()<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">def slow_square(x):<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    import time<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    time.sleep(1)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    return x*x<u></u><u></u></p>
</div>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">amr = v.map_async(slow_square, randoms)<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<div>
<p class="MsoNormal">sum_sq=0<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">for n,r in enumerate(amr):<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    sum_sq += r<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal">    print &quot;intermediate rms %i: %.3f&quot; % (n, sqrt(sum_sq / (n+1)))<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
</div>
<div>
<p class="MsoNormal">Since the AsyncMapResult object is just an iterable of its results, you can just use it with builtin functions like sum(amr), reduce(func, amr), map(process_result, amr) etc.  These functions will advance step by step as results arrive.<u></u><u></u></p>


</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<div>
<p class="MsoNormal">-MinRK<u></u><u></u></p>
</div>
<div>
<p class="MsoNormal"><u></u> <u></u></p>
</div>
<blockquote style="border:none;border-left:solid #CCCCCC 1.0pt;padding:0in 0in 0in 6.0pt;margin-left:4.8pt;margin-right:0in">
<div>
<div>
<p class="MsoNormal"> <u></u><u></u></p>
<p class="MsoNormal"><span style="color:#888888">--Toby Burnett<u></u><u></u></span></p>
</div>
</div>
<p class="MsoNormal" style="margin-bottom:12.0pt"><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><u></u><u></u></p>
</blockquote>
</div>
<p class="MsoNormal"><u></u> <u></u></p>
</div></div></div>
</div>

</blockquote></div><br>