Python 扭曲回调函数混淆
我正在编写一个twisted教程,只是为了学习更多python,似乎我在这里遇到了一个障碍。下面的doRead()函数是反应器的“回调”。我不明白的是,除此之外的部分是如何工作的 我读取代码的方式是,如果Python 扭曲回调函数混淆,python,twisted,Python,Twisted,我正在编写一个twisted教程,只是为了学习更多python,似乎我在这里遇到了一个障碍。下面的doRead()函数是反应器的“回调”。我不明白的是,除此之外的部分是如何工作的 我读取代码的方式是,如果bytes+=self.sock.recv(1024)将导致一个块,那么它将到达代码的以下部分: if e.args[0] == errno.EWOULDBLOCK: break 然后它将继续进行以下操作: if not bytes: print 'Task %d finish
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())
对我来说,棘手的部分是,如果它被阻塞,那么bytes变量将不包含任何内容,并且会打印“finish”,但它没有。或者至少它会打印出类似“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
整个模块都粘贴在这里:关键是只有当套接字“准备读取”时才会调用方法
doRead
:要么它上面有一些数据,要么它全部完成(然后,读取将返回0
)。因此,您的问题的解决方案不能在doRead
函数中,而是在代码中,只有在适当的时候才调用它
这些代码都在扭曲的“反应器”中,
PoetrySocket
的实例在\uuuu init\uuuuu
中向其添加自身(通过反应器的addReader
方法)。如果你想真正深入地了解twisted的机制,顺便说一句,你似乎在正确的地方(当然是研究twisted的来源之后;-)。感谢Alex的回复。我不是真的想解决任何问题,只是想了解它是如何工作的。我仍然不确定except块中的the break语句之后会发生什么,因为它似乎根本没有到达“if not bytes:”块。@Joseph,所以它(在您的实验中)从未在套接字错误(这将返回有问题的条件)时被调用,但只有在对应方“刚刚挂断”(连接丢失)时才被调用.我无法复制你的结果。当我将代码连接到服务器时,当服务器断开连接时,将打印“finished”。您确定要连接的服务器确实关闭了连接吗?另外,您知道该应用程序最好作为协议实现,而不是作为iReAddScriptor实现,对吗?