[issue12338] multiprocessing.util._eintr_retry doen't recalculate timeouts

STINNER Victor report at bugs.python.org
Mon Jun 20 01:29:44 CEST 2011


STINNER Victor <victor.stinner at haypocalc.com> added the comment:

subprocess._communicate_with_select() retries select.select() on EINTR: it recomputes timeout before each call.

while self._read_set or self._write_set:
    timeout = self._remaining_time(endtime)
    if timeout is not None and timeout < 0:
        raise TimeoutExpired(self.args, orig_timeout)
    try:
        (rlist, wlist, xlist) = \
            select.select(self._read_set, self._write_set, [],
                          timeout)
    except select.error as e:
        if e.args[0] == errno.EINTR:
            continue
        raise
    ...

It has a similar code for select.poll().

asyncore.poll() handles EINTR: it just returns.

> I think it would be better to just implement the retrying version
> of select directly.

It would be nice to share more code between subprocess and multiprocessing, but I don't know where such code should be moved. Create a new module just for one function is stupid. Handling EINTR is a common problem when managing subprocesses.

subprocess has a _eintr_retry_call() function.

multiprocessing has a @_eintr_retry decorator handling supporting more error types (use except (EnvironmentError, select.error):).

----------

_______________________________________
Python tracker <report at bugs.python.org>
<http://bugs.python.org/issue12338>
_______________________________________


More information about the Python-bugs-list mailing list