编写可导入的轻量级Twisted Python客户端函数的好方法
我有一个正在运行的服务器:
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发送到特定的socket, 3)等待返回并解包这个json。
2 个回答
-1
我自己解决了问题。
我使用了套接字(特别是Unix套接字),这让我的应用速度提高了4倍,而且使用起来一点也不难。
所以现在我的解决方案是simplejson加上套接字。
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,并且你还需要写一个回调函数,以便在结果最终到达时运行。不过,这些内容的解释可以放在另一个问题里;)