Skip to main content
 首页 » 编程设计

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

2025年05月04日9kenshinobiy

我正在运行以下服务器:

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,并且您需要编写一个回调函数以在结果最终到达时运行。但对这些的解释属于一个单独的问题;)。