编写轻量级客户端函数的好方法是导入Twisted Python

时间:2009-09-10 08:28:58

标签: python twisted

我运行了以下服务器:

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()

我有多个文件从特定文件导入一个名为“getHash”的特殊函数。 请注意,getHash的参数只是一个文本字典(字符串)。 我如何编写一个简单的客户端函数(getHash):

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

请注意,我想要做的就是: 1)将一个字典转入json, 2)将json转储到特定的套接字中, 3)等待它返回并解压缩json

2 个答案:

答案 0 :(得分:2)

您希望getHash返回Deferred,而不是同步值。

执行此操作的方法是创建Deferred并将其与执行特定请求的连接相关联。

以下是未经测试的,可能无效,但它应该给你一个粗略的想法:

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

现在,为了使用这个函数,你需要熟悉Deferreds,并且你需要编写一个回调函数来在结果最终到达时运行。但对这些问题的解释属于另一个问题;)。

答案 1 :(得分:-1)

我设法解决了自己的问题。

使用套接字(特别是Unix套接字)它可以加速我的应用程序4倍,并且根本不难使用。

所以现在我的解决方案是simplejson + socket