diff --git a/eventlet/tpool.py b/eventlet/tpool.py index e7f0db1..8d73814 100644 --- a/eventlet/tpool.py +++ b/eventlet/tpool.py @@ -292,6 +292,16 @@ def killall(): for thr in _threads: thr.join() del _threads[:] + + # return any remaining results + while not _rspq.empty(): + try: + (e, rv) = _rspq.get(block=False) + e.send(rv) + e = rv = None + except Empty: + pass + if _coro is not None: greenthread.kill(_coro) _rsock.close() diff --git a/tests/tpool_test.py b/tests/tpool_test.py index 5af1a40..818bb45 100644 --- a/tests/tpool_test.py +++ b/tests/tpool_test.py @@ -20,7 +20,7 @@ import re import time import eventlet -from eventlet import tpool +from eventlet import tpool, debug, event from eventlet.support import six from tests import LimitedTestCase, skipped, skip_with_pyevent, main @@ -228,6 +228,22 @@ class TestTpool(LimitedTestCase): tpool.killall() tpool.setup() + @skip_with_pyevent + def test_killall_remaining_results(self): + semaphore = event.Event() + + def native_fun(): + time.sleep(.5) + + def gt_fun(): + semaphore.send(None) + tpool.execute(native_fun) + + gt = eventlet.spawn(gt_fun) + semaphore.wait() + tpool.killall() + gt.wait() + @skip_with_pyevent def test_autowrap(self): x = tpool.Proxy({'a': 1, 'b': 2}, autowrap=(int,))