python - Use Twisted's getPage as urlopen? -
i use twisted non-blocking getpage method within webapp, feels quite complicated use such function compared urlopen.
this example of i'm trying achive:
def web_request(request): response = urllib.urlopen('http://www.example.org') return httpresponse(len(response.read()))
is hard have similar getpage?
the thing realize non-blocking operations (which seem explicitly want) can't write sequential code them. operations don't block because don't wait result. start operation , return control function. so, getpage
doesn't return file-like object can read urllib.urlopen
does. , if did, couldn't read until data available (or block.) , can't call len()
on it, since needs read data first (which block.)
the way deal non-blocking operations in twisted through deferreds
, objects managing callbacks. getpage
returns deferred
, means "you result later". can't result until it, add callbacks deferred
, , deferred
call these callbacks when result is available. callback can want to:
def web_request(request) def callback(data): httpresponse(len(data)) d = getpage("http://www.example.org") d.addcallback(callback) return d
an additional problem example web_request
function blocking. want while wait result of getpage
become available? else within web_request
, or wait? or want turn web_request
non-blocking? if so, how want produce result? (the obvious choice in twisted return deferred
-- or same 1 getpage
returns, in example above. may not appropriate if you're writing code in framework, though.)
there is way write sequential code using deferreds
, although it's restrictive, harder debug, , core twisted people cry when use it: twisted.internet.defer.inlinecallbacks
. uses new generator feature in python 2.5 can send data generator, , code this:
@defer.inlinecallbacks def web_request(request) data = yield getpage("http://www.example.org") httpresponse(len(data))
like example explicitly returned d
deferred, this'll work if caller expects web_request
non-blocking -- defer.inlinecallbacks
decorator turns generator function returns deferred
.
Comments
Post a Comment