[Twisted-Python] PBClientFactory and getRootObject
Fabrizio Mancini
mr.file at gmail.com
Thu Apr 2 15:31:12 MDT 2009
Hi everyone,
I'm writing a server and a client using Perspective Broker with no Avatar
and no auth.
The server accumulates some data using a DeferredQueue.
The clients using a remote call retrieve one item per time from the queue
and elaborates it making some changes on a database using adbapi.
What i want to know is:
1) how can i recursively call the remote method to retrieve the items from
the server?
2) can i defer the database operations to a thread so every client can
elaborates multiple requests per time?
The code i'm using is this:
from twisted.internet import reactor, defer, pb
from twisted.enterprise import adbapi
from twisted.python import log
import os
globalConfigurationFile=os.path.abspath('conf' + os.sep +
'configuration.ini')
class DataBasePreparerClient(object):
'''
DataBasePreparerClient()
'''
def __init__(self, globalConfigurationFile):
self._gcf = globalConfigurationFile
self.data = {}
self._parseConfig()
self._createDbPool()
self.d = defer.Deferred()
self.clientfactory = pb.PBClientFactory()
def _createDbPool(self):
self.dbpool = adbapi.ConnectionPool('cx_Oracle',
self.data['db_username'], self.data['db_password'], self.data['db_tns'])
def connect(self):
reactor.connectTCP(self.data['server_ip'], self.data['server_port'],
self.clientfactory)
self.d = self.clientfactory.getRootObject()
self.dbpool.connect()
self.d.addCallbacks(self.get_item, self._eb)
def _eb(self, reason):
print "Failure: ", reason.getErrorMessage()
def get_item(self, result):
d = result.callRemote("get_item")
d.addCallback(self.got_item)
def got_item(self, item):
query = "update table where ..."
res = self.dbpool.runOperation(query)
res.addErrback(self._eb)
self.d = self.clientfactory.getRootObject()
self.d.addCallbacks(self.get_item, self._eb)
if __name__ == "__main__":
DataBasePreparerClient(globalConfigurationFile).connect()
reactor.run()
To call recursively the remote object in function connect i call
clientfactory.getRootObject() and addCallback() for the first time, and the
i recall always self.clientfactory.getRootObject() and self.d.addCallback
when the db query has completed.
Is this correct?
Do I have to always call self.clientfactory.getRootObject() every time i
have to call a remote method?
Can i deferToThread the function got_item or
self.dbpool.runOperation(query)?
Thanks in advance
Fabrizio
-------------- next part --------------
An HTML attachment was scrubbed...
URL: </pipermail/twisted-python/attachments/20090402/871d5ba2/attachment.html>
More information about the Twisted-Python
mailing list