示例#1
0
文件: futures.py 项目: kaste/ndb-x
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()
示例#2
0
文件: futures.py 项目: kaste/ndb-x
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()
示例#3
0
文件: futures.py 项目: kaste/ndb-x
 def __init__(self, max_size=1, info=None):
     super(DeferredFuturesQueue, self).__init__(info=info)
     self.lock = BoundedSemaphore(max_size)
示例#4
0
文件: futures.py 项目: kaste/ndb-x
 def __init__(self, max_size=1, info=None):
     super(DeferredFuturesQueue, self).__init__(info=info)
     self.lock = BoundedSemaphore(max_size)