我对Twisted反应器有几个问题。
1 /什么样的错误会导致反应堆崩溃/停止/终止?什么样的错误不会?
2 /我有两个反应堆,每个反应堆运行不同的协议。我有协议A和B.
每次处理输入时,一个reactor会创建协议A的新实例。如果协议A的实例中存在错误,则该错误仅影响实例,并且反应器保持平稳运行。
另一个反应器只运行协议B的一个实例(特别是我用它来处理标准IO)。就像这样:
stdio.StandardIO(ProtocolB())
reactor.run()
如果输入以某种方式在协议B中给出错误,那么它会影响整个反应堆。在这种情况下反应堆真的会停止吗?
3 /在上面的第二个反应堆的情况下,如果检测到错误,是否可以创建协议B的新实例来替换旧实例?
答案 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的新实例,如果出现错误,则替换旧实例 检测
你可以但你不应该这样做。如果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()