Python: run functions in parallel with a multiprocessing wrapper function

One common way to run functions in parallel with Python is to use the multiprocessing module which is powerful, it has many options to configure and a lot of things to tweak.

Join Medium with my referral link - Konstantinos Patronas
Read every story from Konstantinos Patronas (and thousands of other writers on Medium). Your membership fee directly…

But what about if we want just a very simple functionality like running a number of functions in parallel and nothing else?

We can use the following wrapper function for this:def run_parallel(*functions):
   '''
   Run functions in parallel
   '''
   from multiprocessing import Process
   processes = []
   for function in functions:
       proc = Process(target=function)
       proc.start()
       processes.append(proc)
   for proc in processes:
       proc.join()

This function allows us to input as parameter any number of functions with or without their parameters and executed in parallel.

Example#!/usr/bin/env python3def task_a():
   print('this is task a')def task_b():
   print('this is task b')def hello(msg):
   print('Hello: %s'%(msg))def run_parallel(*functions):
   '''
   Run functions in parallel
   '''
   from multiprocessing import Process
   processes = []
   for function in functions:
       proc = Process(target=function)
       proc.start()
       processes.append(proc)
   for proc in processes:
       proc.join()if __name__ == '__main__':
   run_parallel(task_a(),task_b(),hello(msg="konstantinos"))

Executing this will bring the following results:this is task a
this is task b
Hello: konstantinos

This is nice and simple, but how we will get results back from the functions?

To do this we need to use a shared variable like a list and append the results of the function in the list:#!/usr/bin/env python3
results = []
def task_a():
   res = {}
   res['task_a'] = 1 + 1
   results.append(res)def task_b():
   res = {}
   res['task_b'] = 2 + 2
   results.append(res)def task_c(name):
   res = {}
   res['task_c'] = "Name: %s"%(name)
   results.append(res)def run_parallel(*functions):
   '''
   Run functions in parallel
   '''
   from multiprocessing import Process
   processes = []
   for function in functions:
       proc = Process(target=function)
       proc.start()
       processes.append(proc)
   for proc in processes:
       proc.join()if __name__ == '__main__':run_parallel(task_a(),task_b(),task_c(name="konstantinos"))
   print(results)

Results:[{'task_a': 2}, {'task_b': 4}, {'task_c': 'Name: konstantinos'}]

Join Medium with my referral link - Konstantinos Patronas
Read every story from Konstantinos Patronas (and thousands of other writers on Medium). Your membership fee directly…