繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM