non blocking read()
Jp Calderone
exarkun at divmod.com
Wed Dec 1 17:07:10 EST 2004
On 01 Dec 2004 15:55:18 -0500, David Bolen <db3l at fitlinxx.com> wrote:
>Jp Calderone <exarkun at divmod.com> writes:
>
> > def nonBlockingReadAll(fileObj):
> > bytes = []
> > while True:
> > b = fileObj.read(1024)
> > bytes.append(b)
> > if len(b) < 1024:
> > break
> > return ''.join(bytes)
>
> Wouldn't this still block if the input just happened to end at a
> multiple of the read size (1024)?
Only if the file has not been put into non-blocking mode. But the function as given is wrong, I left out the exception handling in the case you mention. Rather than blocking forever, fileObj.read(1024) will raise IOError (EAGAIN) if the input happened to be a multiple of 1024 bytes long. Here is the corrected version:
def nonBlockingReadAll(fileObj):
bytes = []
while True:
try:
b = fileObj.read(1024)
except IOError, e:
if e.args[0] == errno.EAGAIN:
break
raise
bytes.append(b)
if len(b) < 1024:
break
return ''.join(bytes)
Arguably, there is no longer any point to checking the length of b in this version, since at worst you will break on the next iteration of the loop. It doesn't hurt, though.
Jp
More information about the Python-list
mailing list