non blocking read()
Pierre Barbier de Reuille
pierre.barbier at cirad.fr
Thu Dec 2 05:57:04 EST 2004
Steve Holden a écrit :
> Donn Cave wrote:
>
>> In article <mailman.6995.1101939055.5135.python-list at python.org>,
>> Gustavo Córdova Avila <gustavo.cordova at q-voz.com> wrote:
>>
>>
>>> David Bolen 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)?
>>>>
>>>> -- David
>>>>
>>>
>>> No, it'll read up to 1024 bytes or as much as it can, and
>>> then return an apropriatly sized string.
>>
>>
>>
>> Depends. I don't believe the original post mentioned
>> that the file is a pipe, socket or similar, but it's
>
>
> It did actually specifically mention files.
>
Read more carrefully and you'll see that it mentionned "file object" and
, on UNIX systems, that's very different than "file". It even mentions
"stdin", and stdin (though not always a pipe) always bahaves like a pipe
when it comes to non-blocking reading.
For an answer, you can modify stdin (or whatever file desciptor you
have) to have non-blocking reading operations. It can be done using :
*****************
import fcntl, os
fcntl.fcntl(0, fcntl.F_SETFL, os.O_NONBLOCK)
*****************
You can replace the "0" by whatever file descriptor you want of course !
After that call stdin is non-blocking.
Pierre
More information about the Python-list
mailing list