2016-06-22 4 views
-1

트위스트 된 라이브러리를 사용하여 다른 대기열에서 소비하는 여러 소비자를 설정함으로써 문제가 발생합니다. 이것은 모두 잘 작동하지만, 주 프로그램의 실행을 계속하는 것처럼 보이지는 않습니다. 전화가 오면 오히려 그냥 앉아서 대기하고 내 인쇄 진술을 때리지 마십시오. reactor.run()Twisted is blocking

여기 내 주요 코드는 실제로 소비자가 : 여기

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 

트위스트의 나의 이해는 잘못 될 수있다, 그러나 나는 생각했을 것이다 이 인쇄 문 a를 nd ws.client.on이 (가) 해고되었을 것입니다.

+0

예 트위스트에 대한 이해가 잘못되었지만 배울 때 모든 사람에게 발생합니다. 모든 것은''reactor'' 루프 내에서 실행되어야합니다. –

+0

이 코드를 원자로로 옮기려면 어떻게해야할까요? – Johnathon64

+0

기본적으로 모든 logic이''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()를 제거하고 호출하는 것입니다 할 수있는 한 가지 방법. 불행히도, 나는 그것을 테스트하기에 충분한 코드를 모른다.