From 37b064add273cac059700f36c562652695cdd084 Mon Sep 17 00:00:00 2001 From: Denis Bilenko Date: Sun, 24 May 2009 18:30:37 +0700 Subject: [PATCH] coropool.Pool: add track_events parameter and wait() method --- eventlet/coropool.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/eventlet/coropool.py b/eventlet/coropool.py index 8024ab1..75c6b3b 100644 --- a/eventlet/coropool.py +++ b/eventlet/coropool.py @@ -3,13 +3,17 @@ from eventlet import coros, proc, api class Pool(object): - def __init__(self, min_size=0, max_size=4): + def __init__(self, min_size=0, max_size=4, track_events=False): if min_size > max_size: raise ValueError('min_size cannot be bigger than max_size') self.sem = coros.Semaphore(max_size) for _ in xrange(min_size): self.sem.acquire() self.procs = proc.RunningProcSet() + if track_events: + self.results = coros.queue() + else: + self.results = None def free(self): return self.sem.counter @@ -37,7 +41,10 @@ class Pool(object): else: self.sem.acquire() p = self.procs.spawn(func, *args, **kwargs) + # assuming the above line cannot raise p.link(lambda p: self.sem.release()) + if self.results is not None: + p.link(self.results) return p execute_async = execute @@ -47,6 +54,11 @@ class Pool(object): wait_all = waitall + def wait(self): + """Wait for the next execute in the pool to complete, + and return the result.""" + return self.results.wait() + def killall(self): return self.procs.killall()