Found a minor bug in greenpool, added a test for it, and finished converting greenpool_test to not use api.

This commit is contained in:
Ryan Williams
2010-01-20 21:09:03 -05:00
parent 1a375b9e85
commit 5b8acc850f
2 changed files with 31 additions and 10 deletions

View File

@@ -5,6 +5,7 @@ from eventlet import coros
from eventlet import event from eventlet import event
from eventlet import greenthread from eventlet import greenthread
from eventlet import semaphore from eventlet import semaphore
from eventlet.support import greenlets as greenlet
__all__ = ['GreenPool', 'GreenPile'] __all__ = ['GreenPool', 'GreenPile']
@@ -84,10 +85,12 @@ class GreenPool(object):
try: try:
try: try:
func(*args, **kwargs) func(*args, **kwargs)
except (KeyboardInterrupt, SystemExit, GreenletExit): except (KeyboardInterrupt, SystemExit, greenlet.GreenletExit):
raise raise
except: except:
traceback.print_exc() # TODO control this with debug module
#traceback.print_exc()
pass
finally: finally:
if coro is None: if coro is None:
return return

View File

@@ -4,8 +4,9 @@ import os
import random import random
import eventlet import eventlet
from eventlet import api from eventlet import debug
from eventlet import hubs, greenpool, coros, event from eventlet import hubs, greenpool, coros, event
from eventlet.support import greenlets as greenlet
import tests import tests
def passthru(a): def passthru(a):
@@ -16,6 +17,9 @@ def passthru2(a, b):
eventlet.sleep(0.01) eventlet.sleep(0.01)
return a,b return a,b
def raiser(exc):
raise exc
class GreenPool(tests.LimitedTestCase): class GreenPool(tests.LimitedTestCase):
def test_spawn(self): def test_spawn(self):
p = greenpool.GreenPool(4) p = greenpool.GreenPool(4)
@@ -113,9 +117,10 @@ class GreenPool(tests.LimitedTestCase):
self.assertEquals('done', evt.wait()) self.assertEquals('done', evt.wait())
def assert_pool_has_free(self, pool, num_free): def assert_pool_has_free(self, pool, num_free):
self.assertEquals(pool.free(), num_free)
def wait_long_time(e): def wait_long_time(e):
e.wait() e.wait()
timer = api.exc_after(1, api.TimeoutError) timer = eventlet.exc_after(1, eventlet.TimeoutError)
try: try:
evt = event.Event() evt = event.Event()
for x in xrange(num_free): for x in xrange(num_free):
@@ -127,7 +132,7 @@ class GreenPool(tests.LimitedTestCase):
# if the runtime error is not raised it means the pool had # if the runtime error is not raised it means the pool had
# some unexpected free items # some unexpected free items
timer = api.exc_after(0, RuntimeError) timer = eventlet.exc_after(0, RuntimeError())
try: try:
self.assertRaises(RuntimeError, pool.spawn, wait_long_time, evt) self.assertRaises(RuntimeError, pool.spawn, wait_long_time, evt)
finally: finally:
@@ -177,7 +182,7 @@ class GreenPool(tests.LimitedTestCase):
tp = pools.TokenPool(max_size=1) tp = pools.TokenPool(max_size=1)
token = tp.get() # empty out the pool token = tp.get() # empty out the pool
def do_receive(tp): def do_receive(tp):
timer = api.exc_after(0, RuntimeError()) timer = eventlet.exc_after(0, RuntimeError())
try: try:
t = tp.get() t = tp.get()
self.fail("Shouldn't have recieved anything from the pool") self.fail("Shouldn't have recieved anything from the pool")
@@ -234,6 +239,19 @@ class GreenPool(tests.LimitedTestCase):
eventlet.sleep(0) eventlet.sleep(0)
self.assertEqual(set(r), set([1,2,3,4])) self.assertEqual(set(r), set([1,2,3,4]))
def test_exceptions(self):
p = greenpool.GreenPool(2)
for m in (p.spawn, p.spawn_n):
self.assert_pool_has_free(p, 2)
m(raiser, RuntimeError())
self.assert_pool_has_free(p, 1)
p.waitall()
self.assert_pool_has_free(p, 2)
m(raiser, greenlet.GreenletExit)
self.assert_pool_has_free(p, 1)
p.waitall()
self.assert_pool_has_free(p, 2)
def test_imap(self): def test_imap(self):
p = greenpool.GreenPool(4) p = greenpool.GreenPool(4)
result_list = list(p.imap(passthru, xrange(10))) result_list = list(p.imap(passthru, xrange(10)))
@@ -293,8 +311,8 @@ class GreenPile(tests.LimitedTestCase):
for i in xrange(4): for i in xrange(4):
p.spawn(passthru, i) p.spawn(passthru, i)
# now it should be full and this should time out # now it should be full and this should time out
api.exc_after(0, api.TimeoutError) eventlet.exc_after(0, eventlet.TimeoutError)
self.assertRaises(api.TimeoutError, p.spawn, passthru, "time out") self.assertRaises(eventlet.TimeoutError, p.spawn, passthru, "time out")
# verify that the spawn breakage didn't interrupt the sequence # verify that the spawn breakage didn't interrupt the sequence
# and terminates properly # and terminates properly
for i in xrange(4,10): for i in xrange(4,10):
@@ -361,7 +379,7 @@ class Stress(tests.LimitedTestCase):
break break
received += 1 received += 1
if received % 5 == 0: if received % 5 == 0:
api.sleep(0.0001) eventlet.sleep(0.0001)
unique, order = i unique, order = i
self.assert_(latest[unique] < order) self.assert_(latest[unique] < order)
latest[unique] = order latest[unique] = order
@@ -395,7 +413,7 @@ class Stress(tests.LimitedTestCase):
self.assert_(i > latest) self.assert_(i > latest)
latest = i latest = i
if latest % 5 == 0: if latest % 5 == 0:
api.sleep(0.001) eventlet.sleep(0.001)
if latest % 10 == 0: if latest % 10 == 0:
gc.collect() gc.collect()
objs_created = len(gc.get_objects()) - initial_obj_count objs_created = len(gc.get_objects()) - initial_obj_count