[Python-Dev] RFC: PEP 475, Retry system calls failing with EINTR

R. David Murray rdmurray at bitdance.com
Mon Sep 1 17:42:03 CEST 2014


On Mon, 01 Sep 2014 08:30:27 +0300, Marko Rauhamaa <marko at pacujo.net> wrote:
> "R. David Murray" <rdmurray at bitdance.com>:
> 
> > PS: I recently switched from using selectors to using a timeout on a
> > socket because in that particular application I could, and because
> > reading a socket with a timeout handles EINTR (in recent python
> > versions), whereas reading a non-blocking socket doesn't. Under the
> > hood, a socket with a timeout is a non-blocking socket.
> 
> Under what circumstances would a nonblocking socket generate an EINTR?

Windows.  Enough said?

The exact error message was:

    BlockingIOError on my non-blocking socket: 'a non-blocking socket
    operation could not be completed immediately"

Needless to say, I was not expecting this, and was about to tear my
remaining hair out about having to completely restructure the code in
order to be able to handle an EINTR on a read on an FD that I got back
from select as ready, until I realized that the way the code had evolved
the only thing I still needed the select for was the timeout, and that
the EINTR bug in sockets with a timeout had already been fixed (thank
goodness I'm able to use python3.4 for this project).  I got lucky, but
this is clearly a serious problem for writing selectors based code on
Windows.

This should tell you just about everything you need to know about why we
want to fix this problem so that things work cross platform.

--David


More information about the Python-Dev mailing list