在扭曲的 python 示例中突破 while True?

Breaking out of while True in a twisted python example?

当我执行以下操作时:

count = 0
while True: 
    count += 1
    try: 
        print count 
    except IOError:
        print 'cannot open'

这会按预期打印 0、1、2 等。但是在下面扭曲的 python 示例中,即使执行了 print ('bytesread read: ', bytes),执行也会跳出 while 循环。我错过了什么吗?

 class PoetrySocket(object):

    poem = ''

    def __init__(self, task_num, address):
        self.task_num = task_num
        self.address = address
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.sock.connect(address)
        self.sock.setblocking(0)

        # tell the Twisted reactor to monitor this socket for reading
        from twisted.internet import reactor
        reactor.addReader(self)

    def fileno(self):
        try:
            return self.sock.fileno()
        except socket.error:
            return -1

    def connectionLost(self, reason):
        self.sock.close()

        # stop monitoring this socket
        from twisted.internet import reactor
        reactor.removeReader(self)

        # see if there are any poetry sockets left
        for reader in reactor.getReaders():
            if isinstance(reader, PoetrySocket):
                return

        reactor.stop() # no more poetry

    def doRead(self):
        bytes = ''
        count = 0

        while True:
            count += 1
            try:
                bytesread = self.sock.recv(1024)
                if not bytesread:
                    break
                else:
                    bytes += bytesread
                    print ('bytesread read: ', bytes)
            except socket.error, e:pe
                if e.args[0] == errno.EWOULDBLOCK:
                    break
                return main.CONNECTION_LOST

            print ('count read: ', count)

        print ('task? : ', bytes)
        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

    def logPrefix(self):
        return 'poetry'

    def format_addr(self):
        host, port = self.address
        return '%s:%s' % (host or '127.0.0.1', port)


def poetry_main():
    addresses = parse_args()

    start = datetime.datetime.now()

    sockets = [PoetrySocket(i + 1, addr) for i, addr in enumerate(addresses)]

    from twisted.internet import reactor
    reactor.run()

    elapsed = datetime.datetime.now() - start

    for i, sock in enumerate(sockets):
        print 'Task %d: %d bytes of poetry' % (i + 1, len(sock.poem))

    print 'Got %d poems in %s' % (len(addresses), elapsed)


if __name__ == '__main__':
    poetry_main()

打印如下:

('bytesread read: ', 'The Fascin')
('count read: ', 1)
('task? : ', 'The Fascin')
Task 2: got 10 bytes of poetry from 127.0.0.1:10001
('bytesread read: ', 'The Ecstasy\n\nWhere, like a pil')
('count read: ', 1)
('task? : ', 'The Ecstasy\n\nWhere, like a pil')
Task 1: got 30 bytes of poetry from 127.0.0.1:10000
('bytesread read: ', 'Sonnet - T')
('count read: ', 1)
('task? : ', 'Sonnet - T')
Task 3: got 10 bytes of poetry from 127.0.0.1:10002
('bytesread read: ', 'low on a bed\n         A pregna')
('count read: ', 1)
('task? : ', 'low on a bed\n         A pregna')
Task 1: got 30 bytes of poetry from 127.0.0.1:10000
('bytesread read: ', 'ation of w')
('count read: ', 1)
('task? : ', 'ation of w')
Task 2: got 10 bytes of poetry from 127.0.0.1:10001
('bytesread read: ', 'o Science\n')
('count read: ', 1)
('task? : ', 'o Science\n')
Task 3: got 10 bytes of poetry from 127.0.0.1:10002
('bytesread read: ', "nt bank swell'd up to rest\nThe")
('count read: ', 1)

sock.recv() returns '' 在EOF上,所以如果socket的远端关闭文件,它会立即退出循环。