[Twisted-Python] Handling PBConnectionLost errors
Phil Mayers
p.mayers at imperial.ac.uk
Wed Jul 25 09:09:47 MDT 2007
On Wed, 2007-07-25 at 10:38 -0400, Daniel Miller wrote:
> Is this such a stupid question that it doesn't even warrant a response?
Not really, but it's a more complex question than it first seems, and
you're trying very hard to reproduce things that already exist.
First question: why is your PB server allocating "request IDs" and
storing hashes of them. You could just return a pb.Referenceable to the
client, backed by a normal python object (with a normal object
lifecycle) on the server.
Regarding the retry mechanism: It looks to me like you're treating PB
like an RPC mechanism, and finding that the nature of networks (they
fail, unpredictably) is tripping you up. Try thinking of it in a more
message-oriented way.
I would implement it something like this, using the python2.5 yield and
inlineCallbacks functionality:
class MyResources:
def render_POST(self, request):
d = self.doOnlyOnce(request)
d.addCallbacks(self.done, self.failed, (request,), (request,))
return server.NOT_DONE_YET
def done(self, data, request):
request.write(data)
request.finish()
def failed(self, f, request):
request.write("An error occured")
request.write(f.getErrorMessage())
reqeust.finish()
@inlineCallbacks
def doOnlyOnce(self, request):
pbroot = yield self.pbclifactory.getRootObject()
theobject = yield pbroot.callRemote('makeRequest')
data = yield theobject.callRemote('someMethod', request.args)
# some local code here, then...
# ok, done, tell the remote object to "commit" (finalise, delete)
yield theobject.callRemote('commit')
returnValue(data)
Your example is a bit theoretical, so it's difficult to see if this
would work for you.
More information about the Twisted-Python
mailing list