【问题标题】:Twisted Python: reactor and protocolTwisted Python:反应器和协议
【发布时间】:2012-08-10 06:10:12
【问题描述】:

我有几个关于 Twisted reactor 的问题。

1/ 什么样的错误会导致反应堆崩溃/停止/终止?什么样的错误不会?

2/ 我有两个反应器,每个反应器运行不同的协议。我有协议 A 和 B。

一个反应器在每次处理输入时都会创建一个协议 A 的新实例。如果协议 A 的实例出现错误,该错误只会影响该实例,并且反应器会保持平稳运行。

另一个反应器只运行一个协议 B 的实例(特别是我用它来处理标准 IO)。就是这样:

stdio.StandardIO(ProtocolB())
reactor.run()

如果输入以某种方式在协议 B 中给出错误,那么它会影响整个反应器。在那种情况下反应堆真的停止了吗?

3/ 在上面第二个reactor的情况下,如果检测到错误,是否可以创建一个协议B的新实例来替换旧实例?

【问题讨论】:

    标签: python protocols twisted reactor


    【解决方案1】:

    1/ 什么样的错误会导致反应堆崩溃/停止/终止?什么 那种错误不会?

    经验法则是:reactor 一直运行,直到您调用 reactor.stop() 或响应预期事件,例如 SIGINT 信号(键盘中断)。

    如果输入以某种方式在协议 B 中给出错误,那么它会影响 整个反应堆。在那种情况下反应堆真的会停止吗?

    不,代码中的异常不会停止反应器:

    import sys
    from twisted.internet import reactor, task
    
    def raise_exception():
        raise RuntimeError
    reactor.callWhenRunning(raise_exception)
    
    task.LoopingCall(sys.stderr.write, '.').start(.4) # heartbeat
    reactor.callLater(5, reactor.stop) # stop reactor
    reactor.run()
    

    2/ 我有两个反应器,每个反应器运行不同的协议。我有 协议 A 和 B。

    无论协议数量是多少,都应该只有一个反应器。

    3/ 在上面的第二个反应器的情况下,是否可以创建一个 如果出现错误,协议 B 的新实例将替换旧实例 检测到?

    你可以,但你不应该这样做。如果connectionMadelineReceived 引发异常,这是一个错误,您应该修复它。

    这是一个在异常后重新启动的示例。这只是一个演示,它是可能的,不要在实际代码中使用它

    from twisted.internet import reactor
    from twisted.internet.stdio import StandardIO
    from twisted.protocols.basic import LineReceiver
    
    prompt = ">>>> "
    class ReverseLineProtocol(LineReceiver):
        delimiter = '\n'
    
        def connectionMade(self):
            self.sendLine("Write everything in reverse.")
            self.transport.write(prompt)
    
        def lineReceived(self, line):
            if line == 'raise':
                reactor.callLater(1, launch)
                raise RuntimeError
            self.sendLine(line[::-1])
            self.transport.write(prompt)
    
    def launch():
        StandardIO(ReverseLineProtocol())
    
    launch()
    reactor.run()
    

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 2011-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-23
      相关资源
      最近更新 更多