我运行了以下服务器:
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
答案 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