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

2 投票
2 回答
515 浏览
提问于 2025-04-15 14:12

我有一个正在运行的服务器:

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,并且你还需要写一个回调函数,以便在结果最终到达时运行。不过,这些内容的解释可以放在另一个问题里;)

撰写回答