Skip to content

Instantly share code, notes, and snippets.

@denik
Created August 12, 2010 10:45
Show Gist options
  • Save denik/520714 to your computer and use it in GitHub Desktop.
Save denik/520714 to your computer and use it in GitHub Desktop.
# not actually tested
from gevent.queue import Queue
from gevent.pool import Pool
class GreenPile(object):
def __init__(self, size_or_pool=1000):
if isinstance(size_or_pool, Pool):
self.pool = size_or_pool
else:
self.pool = Pool(size_or_pool)
self.waiters = Queue()
self.used = False
self.counter = 0
def spawn(self, func, *args, **kw):
self.used = True
self.counter += 1
try:
gt = self.pool.spawn(func, *args, **kw)
self.waiters.put(gt)
except:
self.counter -= 1
raise
def __iter__(self):
return self
def next(self):
if self.counter == 0 and self.used:
raise StopIteration()
try:
return self.waiters.get().get()
finally:
self.counter -= 1
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment