我遇到了一个问题,我设置了多个使用扭曲库从不同队列消费的消费者。这一切都很好并且正常工作,但它似乎没有继续执行主程序,而是它只是坐下来等待,并且在我打电话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"
以下是方法InitSetup
和AsyncConsumerSetup
:
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
会被解雇。
答案 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()
这将是您的主要模块。不幸的是,我不太了解你的代码来测试它。