0

Twisted リアクターについていくつか質問があります。

1/ 原子炉をクラッシュ/停止/終了させるエラーはどのようなものですか? どのようなエラーが発生しないでしょうか?

2/ 2 つのリアクターがあり、それぞれが異なるプロトコルを実行しています。私はプロトコルAとBを持っています。

1 つのリアクターは、入力を処理するたびにプロトコル A の新しいインスタンスを作成します。プロトコル A のインスタンスにエラーが発生した場合、そのエラーはインスタンスにのみ影響し、リアクターはスムーズに動作し続けます。

もう一方のリアクターは、プロトコル B の 1 つのインスタンスのみを実行します (具体的には、標準 IO を処理するために使用します)。単純に次のようになります。

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

入力が何らかの形でプロトコル B にエラーを与えると、リアクター全体に影響します。その場合、原子炉は実際に停止しますか?

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

プロトコルの数に関係なく、リアクターは 1 つだけにする必要があります。

3/ 上記の 2 番目のリアクターの場合、エラーが検出された場合、プロトコル 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 に答える