def METHOD_NAME(self, operation_name, *args, **kwargs):
    if len(self.providers) == 0:
        raise Exception('Please specify list of providers '
            'at config.yaml/providers')
    # if there is single operation requested
    # no need to run it on the thread
    if len(self.providers) == 1:
        provider_name = list(self.providers.keys())[0]
        return self.execute_provider(provider_name, operation_name, *args, **kwargs)
    with ThreadPoolExecutor(max_workers=len(self.providers)) as executor:
        futures = {
            executor.submit(
                self.execute_provider, provider_name, operation_name, *args, **kwargs): provider_name
            for provider_name in self.providers.keys()
        }
        try:
            results = {}
            for future in as_completed(futures):
                results.update(future.result())
            return results
        except KeyboardInterrupt:
            # not a graceful termination
            executor._threads.clear()
            thread._threads_queues.clear()
            raise