[Stackless] Let's Make a Case Re: The case for Twisted
Andrew Francis
andrewfr_ice at yahoo.com
Mon Aug 13 21:36:16 CEST 2007
Hello Christopher:
>Sorry for not acknowledging this immediately.
No problem.
>I did know you did that,and I know it's possible
since >I wrote simple Deferred integration years ago,
as I >think you're aware :-)
1. Christopher, I think it is important to illustrate
how integration is done with examples, documentation,
and discussion. There are a shortage of
Stackless/Twisted examples. In contrast, I learnt much
from studying uThread.py and Richard Tew's MUD server.
2. I feel our approaches try to achieve different
things. As I explained before, I encountered
situations where I believe blockOn would fail. I am
not sure if these problems are because of bad design
on my part, or something endemic to the way Stackless
interoperates with Twisted.
Nevertheless I have a solution although it has less to
be desired performance (I would appreciate feedback .
The solution allows me to do things like safely invoke
Twisted calls from a Request Handler.
Example:
class MyRequestHandler(http.Request):
"""
let us create a tasklet to do work in the request
handler
and allow the Reactor to continue
"""
def process(self):
t = stackless.tasklet(self.doWork)()
def doWork(self):
"""
make a call to a web server from the Request
Handler. I have a layer between my application and
Twsited that handles deferreds.
"""
result =
MyRequestHandler.processor.getPage('http://localhost')
# echo result back to the HTTP client
self.write(result.body)
self.finish()
return
class MyHttp(http.HTTPChannel):
requestFactory = MyRequestHandler
The place where this is useful for the average
developer is communicating with a database or a web
service. I suspect writing the same code with Twisted
alone would be tricky.
>A very high level API such as the one you've
described >is desirable (in fact, I would imagine your
Deferred >integration should pretty much already do
this, given >there's already a client.getPage which
returns
>a Deferred).
Again Christopher, the technical demands of my WS-BPEL
processor dictates how I use Twisted and which issues
I pursue. However one of main things that I have done
is to hide the nitty-gritty of Deferreds. I believe
this approach can be generalised through use of, for
lack of a better term, a custom "reactor" (I know
Glyph's feelings on custom reactors) and import module
tricks (a la StacklessSocket). Right now, it is easy
for me to do this:
def execute(self):
try:
# hide simple deferreds from user
self.processor.getPage('http://localhost')
except TwistedException:
log.msg("A Twisted Exception was thrown")
except :
log.msg( sys.exc_info() )
return
Give me a day or two, and I will post some examples.
Cheers,
Andrew
____________________________________________________________________________________
Luggage? GPS? Comic books?
Check out fitting gifts for grads at Yahoo! Search
http://search.yahoo.com/search?fr=oni_on_mail&p=graduation+gifts&cs=bz
_______________________________________________
Stackless mailing list
Stackless at stackless.com
http://stackless.com/cgi-bin/mailman/listinfo/stackless
More information about the Stackless
mailing list