我正在研究一個扭曲的教程,以瞭解更多的python,看來我已經跑到了這裏的路障。下面的doRead()函數是反應器的「回調」。我不明白的是除了部分是如何工作的。扭曲的回調函數混淆
我閱讀代碼的方式是,如果bytes += self.sock.recv(1024)
就已經引起了塊,然後它會到達代碼的以下部分:
if e.args[0] == errno.EWOULDBLOCK:
break
然後,它會一直持續到以下幾點:
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())
對我來說,棘手的部分是,如果它阻塞,那麼字節變量將不會包含任何內容,並會打印「完成」,但它不會。或者至少它會打印出像「有0個字節」的東西,但它也沒有。在我看來,當代碼遇到來自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
我無法重現您的結果。當我將代碼連接到服務器時,當服務器斷開連接時,將打印「已完成」。你確定你連接的服務器實際上關閉了連接嗎? 此外,你知道這個應用程序會更好地實現爲協議,而不是IReadDescriptor,對嗎? – 2010-07-18 15:44:44