2016-06-22 11 views
-1

私は、ツイストライブラリを使用して異なるキューから消費している複数のコンシューマをセットアップしているという問題が発生しています。これはすべてうまく動作していますが、メインプログラムの実行を続行しているようではなく、電話をかけた後に私のプリントステートメントには絶対に座って待つことはありません。消費者:ツイストがブロックされています

cc = InitSetup() 
AsyncConsumerSetup(DeviceFeaturesConsumer('outboundMessaging', 'messaging', 'outbound', ws, 'registeredCallback', cc, connection), cc) 
reactor.run() 
print "starting to receive device" 
ws.client.on('newDevice', receive_device) 
print "end receive device" 

ここでは、メソッドInitSetupAsyncConsumerSetupです:

def InitSetup(): 
    parameters = ConnectionParameters() 
    cc = protocol.ClientCreator(reactor, 
           TwistedProtocolConnection, 
           parameters) 
    return cc 


def AsyncConsumerSetup(consumer, cc): 
    try: 
     d = cc.connectTCP("127.0.0.1", 5672) 
     d.addCallback(lambda protocol: protocol.ready) 
     d.addCallback(consumer.on_connected) 
     d.addErrback(log.err) 
    except Exception as e: 
     print e 

ツイストの私の理解では、しかし、私はprint文のAと思っているだろう、間違っている可能性がありますnd ws.client.onが発砲したでしょう。

+0

はい、あなたのTwistedに対する理解は間違っていますが、彼らが学ぶときは誰にでも起こります。すべてが '' reactor''ループ内で動かなければなりません。 –

+0

このコードを原子炉に移動するにはどうしたらいいですか? – Johnathon64

+0

基本的には、すべてのロジックが '' reactor.run() ''の前に実行されていることを確認する必要があります。ですから、 '' reactor.run() ''を最後まで動かすとうまくいくはずです。 –

答えて

0

reactor.run()の後には何も実行されません。これはイベントループです(一般の人はwhileループです)。これはあなたのコードがブロックされている方法です。考え方はすべてのコードをイベントループで実行させることです。あなたはそれがときreactor開始

def InitSetup(): 
    parameters = ConnectionParameters() 
    cc = protocol.ClientCreator(reactor, 
           TwistedProtocolConnection, 
           parameters) 
    return cc 


def AsyncConsumerSetup(consumer, cc): 
    try: 
     d = cc.connectTCP("127.0.0.1", 5672) 
     d.addCallback(lambda protocol: protocol.ready) 
     d.addCallback(consumer.on_connected) 
     d.addErrback(log.err) 
    except Exception as e: 
     print e 

def initFunction(): 
    cc = InitSetup() 
    AsyncConsumerSetup(DeviceFeaturesConsumer('outboundMessaging', 'messaging', 'outbound', ws, 'registeredCallback', cc, connection), cc) 
    print "starting to receive device" 
    ws.client.on('newDevice', receive_device) 
    print "end receive device" 

reactor.callWhenRunning(initFunction) 
reactor.run() 

これはあなたのメインモジュールとなり、消費者を実行してコードを取る関数にそれを置く、reactor.run()を削除し、それを呼び出すことであろう何ができる一つの方法。残念ながら、私はそれをテストするのに十分なコードを知りません。

関連する問題