扭曲的Python:反应堆和协议

时间:2012-08-14 00:13:45

标签: python protocols twisted reactor

我对Twisted反应器有几个问题。

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:2)

  

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