0

Python、Twisted、Redis、txredisapi での作業。

接続が確立された後、チャンネルを購読および購読解除するための SubscriberProtocol を取得するにはどうすればよいですか?

SubscriberProtocol のインスタンスを取得する必要があると思います。その後、「subscribe」および「unsubscribe」メソッドを使用できますが、取得方法がわかりません。

コード例:

import txredisapi as redis

class RedisListenerProtocol(redis.SubscriberProtocol):
    def connectionMade(self):
        self.subscribe("channelName")
    def messageReceived(self, pattern, channel, message):
        print "pattern=%s, channel=%s message=%s" %(pattern, channel, message)
    def connectionLost(self, reason):
        print "lost connection:", reason

class RedisListenerFactory(redis.SubscriberFactory):
    maxDelay = 120
    continueTrying = True
    protocol = RedisListenerProtocol

次に、これらのクラスの外から:

# I need to sub/unsub from here! (not from inside de protocol)
protocolInstance = RedisListenerProtocol  # Here is the problem
protocolInstance.subscribe("newChannelName")
protocolInstance.unsubscribe("channelName")

なにか提案を?

ありがとう!


次のコードは問題を解決します。

@defer.inlineCallbacks
def subUnsub():
    deferred = yield ClientCreator(reactor, RedisListenerProtocol).connectTCP(HOST, PORT)
    deferred.subscribe("newChannelName")
    deferred.unsubscribe("channelName")

説明: "ClientCreator" を使用して、フラグ "@defer.inlineCallbacks" を持つ関数内で SubscriberProtocol のインスタンスを取得します。遅延データの完了を待機するための "yield" キーワードを忘れないでください。次に、この deferred を使用して、購読および購読解除できます。

私の場合、yield キーワードを忘れたため、遅延が完了せず、メソッドの登録と登録解除が機能しませんでした。

4

1 に答える 1

0
connecting = ClientCreator(reactor, RedisListenerProtocol).connectTCP(HOST, PORT)
def connected(listener):
    listener.subscribe("newChannelName")
    listener.unsubscribe("channelName")
connecting.addCallback(connected)
于 2013-09-04T10:34:25.427 に答える