import threading import queue def do_work(item): return item + 1 def worker(): while True: item = q.get() if item is None: break result = do_work(item) q.task_done() q = queue.Queue() # Start Consumers threads = [] num_worker_threads = 13 # Change this depending on your cores. for i in range(num_worker_threads): thread = threading.Thread(target=worker) thread.start() threads.append(thread) # Start Producer for item in range(100): q.put(item) # block until all tasks are done q.join() # stop workers for i in range(num_worker_threads): q.put(None) for t in threads: t.join()