2

次のサーバーを実行しています。

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) dict を json にダンプすること、2) その json を特定のソケットにダンプすること、3) それが戻ってくるのを待って json をアンパックすることだけです。

4

2 に答える 2

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

この関数を使用するには、Deferred に精通している必要があり、最終的に結果が到着したときに実行するコールバック関数を作成する必要があります。しかし、それらの説明は別の質問に属します;)。

于 2009-09-10T09:16:52.383 に答える
-1

私はなんとか自分の問題を解決することができました。

ソケット(特にUnixソケット)を使用すると、アプリが4倍高速になり、使用するのはまったく難しくありません。

だから今私の解決策はsimplejson+ソケットです

于 2009-09-10T12:23:13.087 に答える