<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-1">
<META content="MSHTML 6.00.2900.3020" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Greetings!</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>I'm quite new to Stackless and this is my first 
post here. ::waves::&nbsp; I'm also fairly new to Twisted and am returning to 
Python after a long absence.&nbsp; My goal is to is to use these three 
technologies along with the Torque Game Engine to build a multiplayer 
game.&nbsp; I'm currently in the technology testing stage.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>I've recently gone through the exercise myself of 
writing a custom Twisted reactor for use with Stackless (under Python 
2.4).&nbsp; After looking at what has been proposed on the Twisted mailing list, 
I took the direction of Stackless driving Twisted rather than the other way 
around.&nbsp; After combining&nbsp;some techniques from Josh Ritter (over at 
GarageGames), Richard Tew (uthread is cool)&nbsp;and other sources, here's what 
I've come up with.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>So far my own testing indicates everything is 
working as expected.&nbsp; But it would be great to know if anyone finds any 
issues with my implementation.&nbsp; And hopefully this'll help Andrew 
out.&nbsp; I've included my stackless reactor as well as a snippet on how to use 
it.&nbsp; You'll have to provide your own Twisted-based HTTP server if you want 
to run the example as is.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>--- stacklessreactor.py ---</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>__all__ = ['install']<BR>import sys<BR>import 
stackless<BR>import uthread<BR>from twisted.internet import 
selectreactor</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>gReactor = None</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>def ReactorTick():<BR>&nbsp;&nbsp;&nbsp; global 
gReactor<BR>&nbsp;&nbsp;&nbsp; while(gReactor.running != 
0):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
gReactor.simulate()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uthread.BeNice()</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>class 
StacklessReactor(selectreactor.SelectReactor):<BR>&nbsp;&nbsp;&nbsp; def 
__init__(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
super(StacklessReactor, 
self).__init__()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.stopped = 
False<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; def 
crash(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print 
"StacklessReactor crash!"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
self.running = 0<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; self.stopped = 
True<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; def 
run(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print "StacklessReactor 
starting to run"<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
self.startRunning()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
stackless.tasklet(ReactorTick)()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
<BR>&nbsp;&nbsp;&nbsp; def 
simulate(self):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
self.iterate()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <BR>def 
StacklessReactorInstall():<BR>&nbsp;&nbsp;&nbsp; global gReactor</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; print "StacklessReactorInstall() 
executed"<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; reactor = 
StacklessReactor()<BR>&nbsp;&nbsp;&nbsp; gReactor = 
reactor<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; from twisted.internet.main 
import installReactor<BR>&nbsp;&nbsp;&nbsp; 
installReactor(reactor)<BR>&nbsp;&nbsp;&nbsp; return reactor</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>install = StacklessReactorInstall<BR></FONT></DIV>
<DIV><FONT face=Arial size=2>--- maintest.py ---</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>import stackless<BR>import uthread</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>def ServerStartup():<BR>&nbsp;&nbsp;&nbsp; from 
twisted.internet import reactor<BR>&nbsp;&nbsp;&nbsp; from httpserver import 
MyHttpFactory<BR>&nbsp;&nbsp;&nbsp; <BR>&nbsp;&nbsp;&nbsp; print "Starting up 
the HTTP server"<BR>&nbsp;&nbsp;&nbsp; reactor.listenTCP(8001, 
MyHttpFactory())<BR>&nbsp;&nbsp;&nbsp; reactor.run()<BR>&nbsp;&nbsp;&nbsp; 
<BR>def run():<BR>&nbsp;&nbsp;&nbsp; """Replacement 
for&nbsp;uthread.run()"""<BR>&nbsp;&nbsp;&nbsp; while(reactor.stopped == 
False):<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uthread.RunNiceTasklets()<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; t = 
stackless.run(10000000)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if t is 
not None:<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
# Need better standard handling of this 
case.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # 
Could StackTrace I 
guess?<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
raise RuntimeError("Runaway tasklet", 
t)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
uthread.CheckSleepingTasklets()</FONT></DIV>
<DIV>&nbsp;</DIV>
<DIV><FONT face=Arial size=2><BR>if __name__ == 
"__main__":<BR>&nbsp;&nbsp;&nbsp; import stacklessreactor<BR>&nbsp;&nbsp;&nbsp; 
stacklessreactor.install()</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>&nbsp;&nbsp;&nbsp; from twisted.internet import 
reactor<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp; print "Running 
reactor"<BR>&nbsp;&nbsp;&nbsp; 
stackless.tasklet(ServerStartup)()<BR>&nbsp;&nbsp;&nbsp; 
run()<BR>&nbsp;&nbsp;&nbsp; print "Finished running reactor"<BR></FONT></DIV>
<DIV><FONT face=Arial size=2>------</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>The only other thing I was going to add is the 
handling of Twisted deferreds using the same method as suggested in <A 
href="http://twistedmatrix.com/trac/browser/sandbox/radix/threadless.py">http://twistedmatrix.com/trac/browser/sandbox/radix/threadless.py</A>&nbsp;blockOn() 
function.</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>Hope that helps!</FONT></DIV>
<DIV><FONT face=Arial size=2></FONT>&nbsp;</DIV>
<DIV><FONT face=Arial size=2>- Dave</FONT></DIV>
<DIV><FONT face=Arial size=2><A 
href="http://www.gnometech.com">http://www.gnometech.com</A></FONT></DIV>
<DIV><FONT face=Arial size=2>&nbsp;</DIV></FONT></BODY></HTML>