On 01 Dec 2004 15:55:18 -0500, David Bolen <[EMAIL PROTECTED]> wrote:
>Jp Calderone <[EMAIL PROTECTED]> 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
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to