扭曲的回调函数混乱

时间:2010-07-18 03:36:37

标签: python 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变量将不包含任何东西,并且会打印“完成”,但事实并非如此。或者至少它会打印出类似“得到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

1 个答案:

答案 0 :(得分:2)

关键是当套接字“准备好读取”时,方法doRead仅被称为 :要么它上面有一些数据,要么全部完成(然后,阅读将返回0)。因此,问题的解决方案不能出现在doRead函数中 - 只有在适当时才会在代码中调用

该代码全部在Twisted“reactor”中,PoetrySocket的实例在__init__中添加了自己(通过reactor的addReader方法)。如果你想在真正的非合作深度中理解扭曲的机制,顺便说一句,你似乎是在正确的位置(当然是研究扭曲的来源本身; - )。