Antoine Pitrou <pit...@free.fr> added the comment:

> Wierdly, it looks like BlockingIO is not raised anywhere in the code
> for the C implementation of io.

That would explain why it isn't raised :)

This is a hairy issue: read(n) is documented as returning either n bytes or 
nothing. But what if less than n bytes are available non-blocking? Currently we 
return a partial read. readline() behaviour is especially problematic:

>>> fcntl.fcntl(r, fcntl.F_SETFL, os.O_NDELAY)
0
>>> rf = open(r, mode='rb')
>>> os.write(w, b'xy')
2
>>> rf.read(3)
b'xy'
>>> os.write(w, b'xy')
2
>>> rf.readline()
b'xy'

We should probably raise BlockingIOError in these cases, but that complicates 
the implementation quite a bit: where do we buffer the partial data? The 
internal (fixed size) buffer might not be large enough.

write() is a bit simpler, since BlockingIOError has a "characters_written" 
attribute which is meant to inform you of the partial success: we can just 
reuse that. That said, BlockingIOError could grow a "partial_read" attribute 
containing the read result...

Of course, we may also question whether it's useful to use buffered I/O objects 
around non-blocking file descriptors; if you do non-blocking I/O, you generally 
want to be in control, which means not having any implicit buffer between you 
and the OS.

(this may be a topic for python-dev)

----------
nosy: +benjamin.peterson, neologix, stutzbach
stage:  -> needs patch

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue13322>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to