Here is my implementation of threaded map:
from threading import Thread from queue import Queue def thread_map(f, iterable, pool=None): """ Just like [f(x) for x in iterable] but each f(x) in a separate thread. :param f: f :param iterable: iterable :param pool: thread pool, infinite by default :return: list if results """ res = {} if pool is None: def target(arg, num): try: res[num] = f(arg) except: res[num] = sys.exc_info() threads = [Thread(target=target, args=[arg, i]) for i, arg in enumerate(iterable)] else: class WorkerThread(Thread): def run(self): while True: try: num, arg = queue.get(block=False) try: res[num] = f(arg) except: res[num] = sys.exc_info() except Empty: break queue = Queue() for i, arg in enumerate(iterable): queue.put((i, arg)) threads = [WorkerThread() for _ in range(pool)] [t.start() for t in threads] [t.join() for t in threads] return [res[i] for i in range(len(res))]