0

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

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

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

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

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

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

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

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

4

1 回答 1

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()
于 2012-08-14T02:07:09.283 回答