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:
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()

View File

@@ -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,))