扭曲阻塞

时间:2016-06-22 10:19:43

标签: python python-2.7 asynchronous rabbitmq twisted

我遇到了一个问题,我设置了多个使用扭曲库从不同队列消费的消费者。这一切都很好并且正常工作,但它似乎没有继续执行主程序,而是它只是坐下来等待,并且在我打电话reactor.run()

之后从未点击我的打印语句

以下是我实际呼叫消费者的主要代码:

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

我对扭曲的理解可能是错误的,但是我会认为印刷语句和ws.client.on会被解雇。

1 个答案:

答案 0 :(得分:0)

reactor.run()之后什么都不会运行,这是一个事件循环(在外行人的术语中是一个while循环)。这是您的代码阻止的方式。我们的想法是让所有代码都在事件循环中执行。您可以采用的一种方法是使用执行消费者的代码,将其放入函数中,删除reactor.run(),并在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()

这将是您的主要模块。不幸的是,我不太了解你的代码来测试它。