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/ 2 つのリアクターがあり、それぞれが異なるプロトコルを実行しています。私はプロトコルAとBを持っています。
プロトコルの数に関係なく、リアクターは 1 つだけにする必要があります。
3/ 上記の 2 番目のリアクターの場合、エラーが検出された場合、プロトコル 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()