<br><br><div class="gmail_quote">On Thu, Sep 9, 2010 at 13:46, Robert Kern <span dir="ltr">&lt;<a href="mailto:robert.kern@gmail.com">robert.kern@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;">

<div class="im">On 9/9/10 2:48 PM, Almar Klein wrote:<br>
&gt;<br>
&gt;<br>
&gt; On 9 September 2010 16:58, Robert Kern &lt;<a href="mailto:robert.kern@gmail.com">robert.kern@gmail.com</a><br>
</div><div><div></div><div class="h5">&gt; &lt;mailto:<a href="mailto:robert.kern@gmail.com">robert.kern@gmail.com</a>&gt;&gt; wrote:<br>
&gt;<br>
&gt;     On 9/9/10 5:42 AM, Almar Klein wrote:<br>
&gt;      &gt; Hi,<br>
&gt;      &gt;<br>
&gt;      &gt; &gt; But thanks for your feedback and ideas: only if we can explain and<br>
&gt;      &gt; &gt; clarify our thoughts sufficiently to justify them, can we be sure that<br>
&gt;      &gt; &gt; we actually understand what we&#39;re doing.<br>
&gt;      &gt;<br>
&gt;      &gt; Hehe, I can imagine you (or others reading this thread) start to think I&#39;m<br>
&gt;      &gt; stubborn. Well I&#39;m a bit of a purist at times and I keep to my opinion unless<br>
&gt;      &gt; I&#39;m convinced by good arguments :)  But hey, its your project, so please<br>
&gt;     let me<br>
&gt;      &gt; know if you&#39;ve had enough of my criticism.<br>
&gt;      &gt;<br>
&gt;      &gt; So here&#39;s a little more ...<br>
&gt;      &gt;<br>
&gt;      &gt; &gt; * I really think you can do with less sockets. I believe that the (black)<br>
&gt;      &gt; &gt; req/rep pair is not needed. You only seem to use it for when raw_input is<br>
&gt;      &gt; &gt; used. But why? When raw_input is used, you can just block and wait for some<br>
&gt;      &gt; &gt; stdin (I think that&#39;ll be the execute_request message). This should not be<br>
&gt;      &gt; &gt; too hard by replacing sys.stdin with an object that has a readline method<br>
&gt;      &gt; &gt; that does this. If two users are present, and one calls raw_input, they can<br>
&gt;      &gt; &gt; both provide input (whoever&#39;s first). To indicate this to the *other* user,<br>
&gt;      &gt; &gt; however, his prompt should be replaced with an empty string, so his cursor<br>
&gt;      &gt; &gt; is positioned right after the &lt;text&gt; in raw_input(&#39;&lt;text&gt;&#39;).<br>
&gt;      &gt;<br>
&gt;      &gt;     Keep in mind that the direction of those sockets (the normal xreq/xrep<br>
&gt;      &gt;     pair for client input and the req/rep for kernel stdin) is opposite,<br>
&gt;      &gt;     and that&#39;s because they represent fundamentally different operations.<br>
&gt;      &gt;<br>
&gt;      &gt;<br>
&gt;      &gt; I get that, but I&#39;m not sure whether this is correct/necessary for the<br>
&gt;      &gt; raw_input. In the original Python interpreter, raw_input just reads from<br>
&gt;     stdin,<br>
&gt;      &gt; the same stream that&#39;s used for executing commands. The interpreter just<br>
&gt;     waits<br>
&gt;      &gt; for the next &quot;command&quot;, which is then interpreted as text, rather than<br>
&gt;     executing<br>
&gt;      &gt; it. In a shell, this idea works quite well.<br>
&gt;<br>
&gt;     Sending a command to the interpreter and sending input to raw_input() are<br>
&gt;     conceptually two different things. By keeping the interfaces for them separate,<br>
&gt;     we allow a greater flexibility to present different things in different ways.<br>
&gt;     Just because the original interpreter implementation conflated them out of<br>
&gt;     necessity due to the limitations of a terminal environment doesn&#39;t mean that is<br>
&gt;     the best thing to do. That would lock us down to the limitations of the original<br>
&gt;     implementation.<br>
&gt;<br>
&gt;<br>
&gt; Fair enough. But what about my second argument: why can commands be executed by<br>
&gt; all clients, but a response to raw_input only from one?<br>
<br>
</div></div>That may be a reason to turn that into an XREQ socket on the kernel and XREP<br>
socket on the frontends, submitting one XREQ message to each frontend, and<br>
letting the first response &quot;win&quot;, but it doesn&#39;t let you reuse the<br>
kernel-XREP/frontend-XREQ pair of sockets for this purpose.<br></blockquote><div><br></div><div>It probably shouldn&#39;t be XREQ on the Kernel, because then raw_input requests would be load balanced across clients, which doesn&#39;t really make sense. If it&#39;s XREP on the Kernel, then the kernel could explicitly request raw_input from the client who caused the prompt.</div>

<div><br></div><div>In fact, the broken load-balanced case is the current behavior (even on REQ/REP sockets) when multiple frontends are connected, so this should be listed as a bug, since as it stands, raw_input is broken for multiple clients.</div>

<div><br></div><div>Using an XREP socket as a keyed requester rather than replier does require a certain amount of zmq.IDENTITY bookkeeping, as I well know from using them in exactly this way in the Parallel IPython code, but I think it&#39;s the right approach here, unless you really want to solicit raw_input from everybody (note that most clients will have no information about what is causing the raw_input call they just received until *after* entering the input), which would more appropriately require a two-socket PUB/SUB model.</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;">
<div><div></div><div class="h5"><br>
--<br>
Robert Kern<br>
<br>
&quot;I have come to believe that the whole world is an enigma, a harmless enigma<br>
  that is made terrible by our own mad attempt to interpret it as though it had<br>
  an underlying truth.&quot;<br>
   -- Umberto Eco<br>
<br>
_______________________________________________<br>
IPython-dev mailing list<br>
<a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/ipython-dev" target="_blank">http://mail.scipy.org/mailman/listinfo/ipython-dev</a><br>
</div></div></blockquote></div><br>