Better accounting of current_size in pools.Pool, thanks to Brett Hoerner for reporting #91.

This commit is contained in:
Ryan Williams
2011-06-08 23:47:26 -07:00
parent af21465a8b
commit f5e5b2bda7
2 changed files with 28 additions and 3 deletions

View File

@@ -113,10 +113,15 @@ class Pool(object):
"""
if self.free_items:
return self.free_items.popleft()
if self.current_size < self.max_size:
created = self.create()
self.current_size += 1
self.current_size += 1
if self.current_size <= self.max_size:
try:
created = self.create()
except:
self.current_size -= 1
raise
return created
self.current_size -= 1 # did not create
return self.channel.get()
if item_impl is not None:

View File

@@ -137,6 +137,26 @@ class TestIntPool(TestCase):
# resize larger and assert that there are more free items
pool.resize(2)
self.assertEquals(pool.free(), 2)
def test_create_contention(self):
creates = [0]
def sleep_create():
creates[0] += 1
eventlet.sleep()
return "slept"
p = pools.Pool(max_size=4, create=sleep_create)
def do_get():
x = p.get()
self.assertEquals(x, "slept")
p.put(x)
gp = eventlet.GreenPool()
for i in xrange(100):
gp.spawn_n(do_get)
gp.waitall()
self.assertEquals(creates[0], 4)
class TestAbstract(TestCase):