|
@@ -69,6 +69,11 @@ warning, debug = logger.warning, logger.debug
|
|
|
Ack = namedtuple('Ack', ('id', 'fd', 'payload'))
|
|
|
|
|
|
|
|
|
+def gen_not_started(gen):
|
|
|
+ # gi_frame is None when generator stopped.
|
|
|
+ return gen.gi_frame and gen.gi_frame.f_lasti == -1
|
|
|
+
|
|
|
+
|
|
|
def process_initializer(app, hostname):
|
|
|
"""Pool child process initializer."""
|
|
|
platforms.signals.reset(*WORKER_SIGRESET)
|
|
@@ -828,9 +833,18 @@ class TaskPool(BasePool):
|
|
|
writers = list(self._active_writers)
|
|
|
for gen in writers:
|
|
|
if (gen.__name__ == '_write_job' and
|
|
|
- gen.gi_frame and gen.gi_frame.f_lasti != -1):
|
|
|
+ gen_not_started(gen)):
|
|
|
# has not started writing the job so can
|
|
|
- # safely discard
|
|
|
+ # discard the task, but we must also remove
|
|
|
+ # it from the Pool._cache.
|
|
|
+ job_to_discard = None
|
|
|
+ for job in values(self._pool._cache):
|
|
|
+ if job._writer() is gen: # _writer is saferef
|
|
|
+ # removes from Pool._cache
|
|
|
+ job_to_discard = job
|
|
|
+ break
|
|
|
+ if job_to_discard:
|
|
|
+ job_to_discard.discard()
|
|
|
self._active_writers.discard(gen)
|
|
|
else:
|
|
|
try:
|