[英]Good way to write a lightweight client function to be imported 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转储到特定的套接字中; 3)等待它返回并解压缩json。
您希望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,并且需要编写一个回调函数以在结果最终到达时运行。 但是对这些问题的解释属于另一个问题;)。
我设法解决了自己的问题。
使用套接字(尤其是Unix套接字)可以使我的应用程序加速4倍,并且一点也不难使用。
所以现在我的解决方案是simplejson + socket
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.