Nice way to write a lightweight client function to import Twisted Python

I have the following server running:

class ThasherProtocol(basic.LineReceiver):
    def lineReceived(self, line):
        dic = simplejson.loads( line)
        ret = self.factory.d[ dic['method'] ]( dic['args'] )
        self.transport.write( simplejson.dumps( ret) )
        self.transport.loseConnection()



class ThasherFactory(ServerFactory):
    protocol = ThasherProtocol 

    def __init__(self):
        self.thasher = Thasher()
        self.d= {   
            'getHash': self.thasher.getHash,
            'sellHash' : self.thasher.sellHash
            }


reactor.listenUNIX( c.LOCATION_THASHER, ThasherFactory() )
reactor.run()

      

I have several files importing a special function called "getHash" from a specific file. Note that the getHash arguments are just a dictionary of texts (strings). How to write a client function (getHash) that can be simple:

from particular file import getHash
i = getHash( { 'type':'url', 'url':'http://www.stackoverflow.com' } )

      

Note that EVERYTHING I WANT TO DO: 1) flush the dict to json, 2) flush the json to a specific socket, 3) wait for this to return and unpack the json

+2


source to share


2 answers


You want getHash

to return Deferred

, not a synchronous value.

The way to do this is to create Deferred

and associate it with a connection that makes a particular request.

The following is untested and probably won't work, but it should give you a rough idea:



import simplejson
from twisted.python.protocol import ClientFactory
from twisted.internet.defer import Deferred
from twisted.internet import reactor
from twisted.protocols.basic import LineReceiver

class BufferingJSONRequest(LineReceiver):
    buf = ''

    def connectionMade(self):
        self.sendLine(simplejson.dumps(self.factory.params))

    def dataReceived(self, data):
        self.buf += data

    def connectionLost(self, reason):
        deferred = self.factory.deferred
        try:
            result = simplejson.load(self.buf)
        except:
            deferred.errback()
        else:
            deferred.callback(result)

class BufferingRequestFactory(ClientFactory):
    protocol = BufferingJSONRequest

    def __init__(self, params, deferred):
        self.params = params
        self.deferred = deferred

    def clientConnectionFailed(self, connector, reason):
        self.deferred.errback(reason)

def getHash(params):
    result = Deferred()
    reactor.connectUNIX(LOCATION_THASHER,
                        BufferingRequestFactory(params, result))
    return result

      

Now, in order to use this function, you will already need to familiarize yourself with Delays and you will need to write a callback function to trigger when the result eventually arrives. But the explanation for this belongs on a separate issue;).

+2


source


I managed to solve my own problem.

Using sockets (Unix sockets in particular) speeds up my application 4x and it's not hard to use at all.



so now my solution is simplejson + socket

-1


source







All Articles