|
@@ -810,8 +810,9 @@ class AsynPool(_pool.Pool):
|
|
|
except KeyError:
|
|
|
pass
|
|
|
else:
|
|
|
- if job._write_to.exitcode is None:
|
|
|
- self._flush_writer(gen)
|
|
|
+ job_proc = job._write_to
|
|
|
+ if job_proc.exitcode is None:
|
|
|
+ self._flush_writer(job_proc.inq, gen)
|
|
|
# workers may have exited in the meantime.
|
|
|
self.maintain_pool()
|
|
|
sleep(next(intervals)) # don't busyloop
|
|
@@ -821,12 +822,16 @@ class AsynPool(_pool.Pool):
|
|
|
self._active_writes.clear()
|
|
|
self._busy_workers.clear()
|
|
|
|
|
|
- def _flush_writer(self, writer):
|
|
|
+ def _flush_writer(self, inq, writer):
|
|
|
+ fds = set([inq._writer])
|
|
|
try:
|
|
|
- list(writer)
|
|
|
- except (OSError, IOError) as exc:
|
|
|
- if get_errno(exc) != errno.EBADF:
|
|
|
- raise
|
|
|
+ while fds:
|
|
|
+ _, writable, again = _select(writers=fds, timeout=0.5)
|
|
|
+ if not again and writable:
|
|
|
+ try:
|
|
|
+ next(writer)
|
|
|
+ except (StopIteration, OSError, IOError, EOFError):
|
|
|
+ break
|
|
|
finally:
|
|
|
self._active_writers.discard(writer)
|
|
|
|