Python 扭曲回调函数混淆

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

我正在编写一个twisted教程,只是为了学习更多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())
对我来说,棘手的部分是,如果它被阻塞,那么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实现,对吗?