<br><div><span class="gmail_quote">On 2/9/08, <b class="gmail_sendername">Brian Granger</b> &lt;<a href="mailto:ellisonbg.net@gmail.com">ellisonbg.net@gmail.com</a>&gt; wrote:</span><div><br>&lt;snip&gt; <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
 &gt; I have a patch I&#39;ll put together which integrates twisted with IPython<br> &gt; without polling... a slight hack starting with the ASPN code from way back.<br> &gt; There might be a much better approach given IPython1&#39;s direction but the<br>
 &gt; ASPN 1000hz polling loop didn&#39;t seem the way to go and I&#39;m not sure I get<br> &gt; where IPython1 is yet.&nbsp;&nbsp;I&#39;ll clean it up and send it in for opinions.<br> <br> <br>I have done some work on this front this week and finally have a nice<br>
 solution.&nbsp;&nbsp;There are two pieces:<br> <br> 1.&nbsp;&nbsp;I have created a simple class that runs the twisted reactor in the thread.</blockquote><div><br>I think I took the other route... spawned the gtk / IPython thread off and kept the main thread for twisted<br>
<br>def run(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.IP.mainloop()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.quitting = True<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.IP.kill()<br><br>&nbsp;&nbsp;&nbsp; def mainloop(self):<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # self.reactor.callLater(self.TIMEOUT, self.on_timer)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def mainLoopThreadDeath(r):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;mainLoopThreadDeath: &quot;, str(r)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; def spawnMainloopThread():<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d=threads.deferToThread(self.run)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d.addBoth(mainLoopThreadDeath)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; reactor.callWhenRunning(spawnMainloopThread)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.reactor.run()<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print &quot;mainloop ending....&quot; <br></div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> 2.&nbsp;&nbsp;The various parts of the twisted API can be called from ipython<br>
 using a function that recently made it into the twisted trunk, called<br> blockingCallFromThread.&nbsp;&nbsp;This function is not in twisted 2.5.0, so I<br> have put it into ipython1 until a new version of twisted is cut.</blockquote>
<div><br>Interesting, I was under the impression (perhaps mistakenly) that&nbsp; reactor.callFromThread() was blocking... actually, I think I&#39;ve passed return values through it... hmmm... need to go back and check on that.<br>
</div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;"> This new arrangement is allowing us to develop very robust twisted<br> based clients that work in regular python/ipython sessions.&nbsp;&nbsp;This is a<br>
 massive improvement over anything else we have had before.<br> <br> Here are the relevant classes in ipython1:<br> <br> <a href="http://ipython.scipy.org/ipython/ipython/browser/ipython1/branches/ipython1-client-r3021/ipython1/kernel/twistedutil.py">http://ipython.scipy.org/ipython/ipython/browser/ipython1/branches/ipython1-client-r3021/ipython1/kernel/twistedutil.py</a><br>
 <br> These things are used here:<br> <br> <a href="http://ipython.scipy.org/ipython/ipython/browser/ipython1/branches/ipython1-client-r3021/ipython1/kernel/multiengineclient.py">http://ipython.scipy.org/ipython/ipython/browser/ipython1/branches/ipython1-client-r3021/ipython1/kernel/multiengineclient.py</a><br>
 <a href="http://ipython.scipy.org/ipython/ipython/browser/ipython1/branches/ipython1-client-r3021/ipython1/kernel/client.py">http://ipython.scipy.org/ipython/ipython/browser/ipython1/branches/ipython1-client-r3021/ipython1/kernel/client.py</a><br>
 <br> I should have this branch ready to merge into ipython1&#39;s trunk in a few days.<br> <br> Brian<br> <br> &gt; --<br> <br>&gt;<br> &gt; -glenn<br> &gt;<br> &gt; Glenn H. Tarbox, PhD<br> &gt; <a href="mailto:glenn@tarbox.org">glenn@tarbox.org</a><br>
 &gt;<br> &gt;<br> &gt;<br> &gt; On 2/9/08, Ondrej Certik &lt;<a href="mailto:ondrej@certik.cz">ondrej@certik.cz</a>&gt; wrote:<br> &gt; &gt; On Feb 9, 2008 1:08 PM, Gael Varoquaux &lt;<a href="mailto:gael.varoquaux@normalesup.org">gael.varoquaux@normalesup.org</a>&gt;<br>
 &gt; wrote:<br> &gt; &gt; &gt; Hi,<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; Pardon me, but you almost sound like a troll :-&gt;.<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; Let me tell you why git is totally out of question. It works terribly<br>
 &gt; &gt; &gt; poorly under windows. Up to recently it did not work at all under<br> &gt; &gt; &gt; windows. Now it requires cygwin, and is terribly poorly integrated with<br> &gt; &gt; &gt; the system.<br> &gt; &gt; &gt;<br>
 &gt; &gt; &gt;<br> &gt; &gt; &gt; About Canonical reinventing the wheel with bzr. Well there might be more<br> &gt; &gt; &gt; than one solution to one problem. Git, hg and bzr have all had their<br> &gt; pros<br> &gt; &gt; &gt; and their cons. The DVCS is a young field, and different players have<br>
 &gt; &gt; &gt; tried different solutions. Currently the difference between hg and bzr<br> &gt; is<br> &gt; &gt; &gt; leveling off, as bzr is focusing on performance, and hg is focusing on<br> &gt; &gt; &gt; merge. Anyhow, I don&#39;t want to go in another endless hg vs bzr<br>
 &gt; discussion<br> &gt; &gt; &gt; (I don&#39;t mention git for the reasons given above). Bzr works very well<br> &gt; &gt; &gt; under windows, as one of its main developpers runs windows. I have<br> &gt; &gt; &gt; seen hg successfully used under windows. I have used both, and I know<br>
 &gt; &gt; &gt; both get the work done.<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; I favor doing whatever gets the work done the easiest. It happens that<br> &gt; &gt; &gt; launchpad is a very convenient (though not perfect) web platform. I use<br>
 &gt; &gt; &gt; it for other projects, and I have been pleased not only by the current<br> &gt; &gt; &gt; features, but also by the features they keep adding. These guys listen<br> &gt; to<br> &gt; &gt; &gt; their users. Moreover, I want to stress that a choice taken now can be<br>
 &gt; &gt; &gt; revoked later. What matters is getting the work done!<br> &gt; &gt; &gt;<br> &gt; &gt; &gt; My 2 cents,<br> &gt; &gt;<br> &gt; &gt;<br> &gt; &gt; You are right.<br> &gt; &gt;<br> &gt; &gt; Ondrej<br> &gt; &gt;<br>
 &gt;<br> &gt;<br> &gt;<br> &gt;<br> &gt;<br> <br>&gt; _______________________________________________<br> &gt; IPython-dev mailing list<br> &gt; <a href="mailto:IPython-dev@scipy.org">IPython-dev@scipy.org</a><br> &gt; <a href="http://lists.ipython.scipy.org/mailman/listinfo/ipython-dev">http://lists.ipython.scipy.org/mailman/listinfo/ipython-dev</a><br>
 &gt;<br> &gt;<br> </blockquote></div><br><br clear="all"><br>-- <br>-glenn (**** Note: New Number ***)<br><br>Glenn H. Tarbox, PhD<br>**** 206-494-0819 *** =&gt; New Number<br><a href="mailto:glenn@tarbox.org">glenn@tarbox.org</a>