2

我正在运行以下服务器:

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)将 dict 转储到 json 中,2)将该 json 转储到特定的套接字中,3)等待它返回并解压缩 json

4

2 回答 2

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,并且你需要编写一个回调函数来在结果最终到达时运行。但是对这些的解释属于一个单独的问题;)。

于 2009-09-10T09:16:52.383 回答
-1

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

使用套接字(尤其是 Unix 套接字)它可以将我的应用程序加速 4 倍,而且使用起来并不困难。

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

于 2009-09-10T12:23:13.087 回答