STINNER Victor <[email protected]> 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 <[email protected]>
<http://bugs.python.org/issue12338>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe:
http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com