저는 파이썬에 대해 더 배우기 위해 트위스트 튜토리얼을 작성 중입니다. 여기서는로드 블록을 만났습니다. 아래 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
결과를 재현 할 수 없습니다. 코드를 서버에 연결하면 서버 연결이 끊어지면 "finished"가 인쇄됩니다. 연결하려는 서버가 실제로 연결을 닫았습니까? 또한이 응용 프로그램이 IReadDescriptor가 아닌 프로토콜로 더 잘 구현된다는 것을 알고 계십니까? –