from multiprocessing import Process, Queue
# Input arguments: tasks = [(func, args)].
def parallel_work(tasks, num_workers):
task_queue = Queue()
done_queue = Queue()
num_workers = min(num_workers, len(tasks))
for func, args in tasks:
task_queue.put((func, args))
def worker(input, output):
for func, args in iter(input.get, 'stop'):
result = func(*args)
output.put((args, result))
for _ in range(num_workers):
Process(target=worker, args=(task_queue, done_queue)).start()
for _ in tasks:
_, _ = done_queue.get()
for _ in range(num_workers):
task_queue.put('stop')