2012-08-14 2 views
0

트위스티드 반응기에 대해 몇 가지 질문이 있습니다.꼬인 파이썬 : 반응기 및 프로토콜

1/어떤 종류의 오류가 반응기를 충돌/정지/종료합니까? 어떤 종류의 오류가 발생하지 않을까요?

2/나는 각각 다른 프로토콜을 실행하는 두 개의 원자로가 있습니다. 나는 프로토콜 A와 B를 가지고있다.

한 반응기는 입력을 처리 할 때마다 프로토콜 A의 새로운 인스턴스를 만든다. 프로토콜 A의 인스턴스에 오류가있는 경우 해당 오류는 인스턴스에만 영향을 미치고 원자로는 원활하게 실행됩니다.

다른 반응기는 프로토콜 B의 하나의 인스턴스 만 실행합니다 (특히 표준 IO를 처리하기 위해이 인터페이스를 사용합니다). 이것은 단순히 다음과 같습니다 :

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

입력이 어떻게하면 프로토콜 B에서 오류가 발생하면 전체 반응기에 영향을줍니다. 이 경우 원자로가 실제로 정지합니까?

3/위의 두 번째 반응기의 경우 오류가 감지되면 이전 인스턴스를 대체하기 위해 프로토콜 B의 새 인스턴스를 만들 수 있습니까?

답변

2

1/어떤 종류의 오류가 반응기를 충돌/정지/종료합니까? 무엇 종류의 오류가 아니겠습니까?

엄지 손가락의 규칙은 다음과 같습니다 reactor.stop()까지 reactor 실행 당신 또는 예상 예를 들어, 이벤트, 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/I는 두 개의 원자로가 각각 다른 프로토콜을 실행. 나는 프로토콜 A와 B를 가지고있다.

어떤 프로토콜이든 하나의 반응기가 있어야한다. 상기 제 2 반응기의 경우

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