在扭曲的 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的远端关闭文件,它会立即退出循环。
当我执行以下操作时:
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的远端关闭文件,它会立即退出循环。