tpool: make sure we return results during killall

since we are about to delete the _rspq
This commit is contained in:
David Szotten
2014-04-05 17:12:58 +01:00
committed by Sergey Shepelev
parent bab1116809
commit 52d42dd741
2 changed files with 27 additions and 1 deletions

View File

@@ -292,6 +292,16 @@ def killall():
for thr in _threads: for thr in _threads:
thr.join() thr.join()
del _threads[:] 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: if _coro is not None:
greenthread.kill(_coro) greenthread.kill(_coro)
_rsock.close() _rsock.close()

View File

@@ -20,7 +20,7 @@ import re
import time import time
import eventlet import eventlet
from eventlet import tpool from eventlet import tpool, debug, event
from eventlet.support import six from eventlet.support import six
from tests import LimitedTestCase, skipped, skip_with_pyevent, main from tests import LimitedTestCase, skipped, skip_with_pyevent, main
@@ -228,6 +228,22 @@ class TestTpool(LimitedTestCase):
tpool.killall() tpool.killall()
tpool.setup() 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 @skip_with_pyevent
def test_autowrap(self): def test_autowrap(self):
x = tpool.Proxy({'a': 1, 'b': 2}, autowrap=(int,)) x = tpool.Proxy({'a': 1, 'b': 2}, autowrap=(int,))