我正在研究一个扭曲的教程,以了解更多的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