簡體   English   中英

扭曲的Python:反應堆和協議

[英]Twisted Python: reactor and protocol

我對Twisted反應器有幾個問題。

1 /什么樣的錯誤會導致反應堆崩潰/停止/終止? 什么樣的錯誤不會?

2 /我有兩個反應堆,每個反應堆運行不同的協議。 我有協議A和B.

每次處理輸入時,一個反應器會創建協議A的新實例。 如果協議A的實例中存在錯誤,則該錯誤僅影響實例,並且反應器保持平穩運行。

另一個反應器只運行協議B的一個實例(特別是我用它來處理標准IO)。 它就像這樣:

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

如果輸入以某種方式在協議B中給出錯誤,則它會影響整個反應器。 在這種情況下反應堆真的會停止嗎?

3 /對於上面的第二個反應堆,如果檢測到錯誤,是否可以創建協議B的新實例來替換舊實例?

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引發異常則是一個bug,你應該修復它。

這是一個在異常后重新啟動的示例。 這只是一個示范,它是可能的, 不要在實際的代碼中使用它

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM