class DeferredFuturesQueue(ndb.MultiFuture): """ This Queue accepts as many FutureFuture's or callables which return futures as you want, but guarantess that only max_size futures run concurrently. The result of this future is a list of the results of the dependant futures just like the ndb.MultiFuture """ def __init__(self, max_size=1, info=None): super(DeferredFuturesQueue, self).__init__(info=info) self.lock = BoundedSemaphore(max_size) def add_dependent(self, func, *args, **kwargs): if isinstance(func, FutureFuture): fut = func elif hasattr(func, '__call__'): fut = FutureFuture(func, *args, **kwargs) else: raise RuntimeError("fut must be a FutureFuture or a callable " "that returns a future; received %r" % fut) super(DeferredFuturesQueue, self).add_dependent(fut) lock = self.lock.acquire() lock.add_immediate_callback(fut.start) def _signal_dependent_done(self, fut): super(DeferredFuturesQueue, self)._signal_dependent_done(fut) self.lock.release()
def __init__(self, max_size=1, info=None): super(DeferredFuturesQueue, self).__init__(info=info) self.lock = BoundedSemaphore(max_size)