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 的新实例来替换旧实例?
你可以,但你不应该这样做。如果connectionMade
,lineReceived
引发异常,这是一个错误,您应该修复它。
这是一个在异常后重新启动的示例。这只是一个演示,它是可能的,不要在实际代码中使用它。
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()