【问题标题】:Twisted is blockingTwisted 阻塞
【发布时间】:2016-06-22 10:19:43
【问题描述】:

我遇到了一个问题,我设置了多个使用扭曲库从不同队列消费的消费者。这一切都很好并且工作正常,但是它似乎并没有继续执行主程序,而是在我调用 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

我对 twisted 的理解可能是错误的,但我原以为 print 语句和 ws.client.on 会被解雇。

【问题讨论】:

  • 是的,您对 Twisted 的理解是错误的,但每个人在学习时都会遇到这种情况。一切都必须在reactor 循环内运行。
  • 臭名昭著,我该如何将代码移入反应器。
  • 您基本上必须确保所有逻辑在reactor.run() 之前执行。因此,如果您将 reactor.run() 移到最后,它应该可以正常工作。

标签: python python-2.7 asynchronous rabbitmq twisted


【解决方案1】:

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()

这将是您的主要模块。不幸的是,我对您的代码了解得不够多,无法对其进行测试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多