[英]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的新實例來替換舊實例?
你可以,但你不應該這樣做。 如果connectionMade
, lineReceived
引發異常則是一個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.