2010-07-18 3 views
1

저는 파이썬에 대해 더 배우기 위해 트위스트 튜토리얼을 작성 중입니다. 여기서는로드 블록을 만났습니다. 아래 doRead() 함수는 원자로의 콜백입니다. 내가 이해할 수없는 것은 예외적 인 부분이 어떻게 작동하는지에 있습니다. 그런 다음트위스트 콜백 함수 혼동

if e.args[0] == errno.EWOULDBLOCK: 
    break 

는 다음에 계속 한 것 :

내가 코드를 읽는 방법은 bytes += self.sock.recv(1024)가 발생했습니다한다면 블록은 다음 코드의 다음 부분에 도달 할 것입니다

if not bytes: 
    print 'Task %d finished' % self.task_num 
    return main.CONNECTION_DONE 
else: 
    msg = 'Task %d: got %d bytes of poetry from %s' 
    print msg % (self.task_num, len(bytes), self.format_addr()) 

내게 까다로운 부분은 블록 된 경우 변수 bytes에는 아무 것도 포함되지 않았으며 "finish"가 인쇄되었지만 그렇지 않다는 것입니다. 또는 적어도 "got 0 bytes"와 같은 것을 인쇄했을 것입니다.하지만 역시 그렇지 않습니다. 거의 내가 recv 호출에서 블록을 만날 때 위의 부분을 완전히 건너 뛸 때처럼 보인다. 왜 이런 일이 일어 났는지 설명 할 수 있습니까?

Task 1: got 30 bytes of poetry from 127.0.0.1:10000 
Task 3: got 10 bytes of poetry from 127.0.0.1:10002 
Task 1: got 30 bytes of poetry from 127.0.0.1:10000 
Task 3: got 10 bytes of poetry from 127.0.0.1:10002 
Task 1: got 30 bytes of poetry from 127.0.0.1:10000 
Task 3: got 3 bytes of poetry from 127.0.0.1:10002 
Task 1: got 30 bytes of poetry from 127.0.0.1:10000 

이 전체 기능입니다 :

def doRead(self): 
    bytes = '' 

    while True: 
     try: 
      bytes += self.sock.recv(1024) 
      if not bytes: 
       break 
     except socket.error, e: # I don't understand this part 
      if e.args[0] == errno.EWOULDBLOCK: 
       break 
      return main.CONNECTION_LOST 

    if not bytes: 
     print 'Task %d finished' % self.task_num 
     return main.CONNECTION_DONE 
    else: 
     msg = 'Task %d: got %d bytes of poetry from %s' 
     print msg % (self.task_num, len(bytes), self.format_addr()) 

    self.poem += bytes 

전체 모듈이 여기에 붙여 : http://pastebin.com/bUnXgbCA

+0

결과를 재현 할 수 없습니다. 코드를 서버에 연결하면 서버 연결이 끊어지면 "finished"가 인쇄됩니다. 연결하려는 서버가 실제로 연결을 닫았습니까? 또한이 응용 프로그램이 IReadDescriptor가 아닌 프로토콜로 더 잘 구현된다는 것을 알고 계십니까? –

답변

2

포인트가 호출되는 doRead 그 방법이다

출력은 다음과 같이이다 소켓이 "읽을 준비가되었습니다"일 때 : 일부 데이터가 있거나 엘이 있습니다. 모두 다 끝났어. 그러면 독서가 0을 돌려 줄 것이다. 그래서 문제에 대한 해결책은 doRead 함수에있을 수 없습니다. 코드 에 모두 해당하는 경우에만을 호출해야합니다.

해당 코드는 모두 PoetrySocket의 인스턴스가 __init__에 (반응기의 addReader 메소드를 통해) 추가되는 뒤틀린 "반응기"에 있습니다. 당신이 진정한 고집 불통 깊이에서 왜곡 된 메커니즘을 이해하기를 원한다면, 그런데, 그 길 (물론 트위스트 소스 자체를 연구하는 그물, ;-)에있는 것처럼 보입니다.

+0

알렉스에 답해 주셔서 감사합니다. 나는 정말로 어떤 문제를 풀려고하지 않고 어떻게 작동하는지 이해하려고 노력하고 있습니다. 나는 여전히 "except if bytes :"블록에 도달하지 않는 것처럼 보이기 때문에 except 블록의 break 문 바로 뒤에 어떤 일이 일어날 지 확신하지 못합니다. –

+0

@Joseph, 그래서 그것은 소켓 오류 (문제의 조건을 반환합니다)하지만 (상대방이 "전화 끊기"(연결 끊김)) 때만 호출됩니다. –