def wait(future: Future): """Wait future object finished. :param future: Future object generated by run_in_executor*() """ sem = BoundedSemaphore() sem.acquire() future.add_done_callback( partial(lambda future, sem: sem.release(), sem=sem)) with sem: return
def __init__(self, *args, **kwargs): super(ContextStackManagerEventletMixin, self).__init__(*args, **kwargs) try: from eventlet.corolocal import local from eventlet.semaphore import BoundedSemaphore except ImportError: raise RuntimeError('the eventlet library is required for %s' % self.__class__.__name__) self._coroutine_context = local() self._contexts.append(self._coroutine_context) self._coroutine_lock = BoundedSemaphore()
def wait_all(futures: List[Future]): """Wait all futures done :param futures: Futures list """ sem = BoundedSemaphore(len(futures)) for future in futures: sem.acquire() future.add_done_callback( partial(lambda future, sem: sem.release(), sem=sem)) while True: try: sem.release(blocking=False) sem.acquire() eventlet.sleep(0.05) except ValueError: break