import time from concurrent import futures def default_executor(): thread_count = 5 return futures.ThreadPoolExecutor(thread_count) class Executor(object): """ Object to facilitate the running of a task, or a set of tasks on an executor that can map multiple tasks across a configurable number of threads """ def __init__(self, executor=None): self._executor = executor or default_executor() @staticmethod def do(task): return task() def task_name(self, task): if hasattr(task, 'task_name'): return str(task.task_name) if hasattr(task, 'func_name'): return str(task.func_name) return 'UnnamedTask' def run(self, tasks): """ Run task or set of tasks :param tasks: the task or tasks you want to execute in the executor's pool :return: The results of the tasks (list) If a single task is pass """ self.start_time = time.time() if callable(tasks): tasks = [tasks] results = [r for r in self._executor.map(self.do, tasks)] self.end_time = time.time() self.task_time = self.end_time - self.start_time task_names = [self.task_name(t) for t in tasks] print("Finished Tasks {tasks}s in {time}fs".format(tasks=task_names, time=self.task_time)) return results def main(): def t1(): return 1 def t2(): return 2 tasks = [t1, t2, t1, t2, t1] exe = Executor() results = exe.run(tasks) assert results == [1, 2, 1, 2, 1] if __name__ == "__main__": main()