diff --git a/eventlet/pool.py b/eventlet/pool.py index cf537eb..9648421 100644 --- a/eventlet/pool.py +++ b/eventlet/pool.py @@ -83,6 +83,14 @@ class Pool(object): """Wait for the next execute in the pool to complete, and return the result.""" return self.results.wait() + + def waiting(self): + """Return the number of coroutines waiting to execute. + """ + if self.sem.balance < 0: + return -self.sem.balance + else: + return 0 def killall(self): """ Kill every running coroutine as immediately as possible.""" diff --git a/tests/test__pool.py b/tests/test__pool.py index de515cf..7b56a82 100644 --- a/tests/test__pool.py +++ b/tests/test__pool.py @@ -20,6 +20,30 @@ class TestCoroutinePool(LimitedTestCase): pool = self.klass(0, 2) worker = pool.execute(some_work) self.assertEqual(value, worker.wait()) + + def test_waiting(self): + pool = self.klass(0,1) + done = coros.event() + def consume(): + done.wait() + def waiter(pool): + evt = pool.execute(consume) + evt.wait() + + waiters = [] + waiters.append(coros.execute(waiter, pool)) + api.sleep(0) + self.assertEqual(pool.waiting(), 0) + waiters.append(coros.execute(waiter, pool)) + api.sleep(0) + self.assertEqual(pool.waiting(), 1) + waiters.append(coros.execute(waiter, pool)) + api.sleep(0) + self.assertEqual(pool.waiting(), 2) + done.send(None) + for w in waiters: + w.wait() + self.assertEqual(pool.waiting(), 0) def test_multiple_coros(self): evt = coros.event()