It was originally defined in PEP 371 by Jesse Noller and Richard Oudkerk.
The multiprocessing package also includes some APIs that are not in the threading module at all.
Python introduced the multiprocessing module to let us write parallel code.
You can use three basic classes: Process, Queue, and Lock, which will help you build a parallel program.
For more details, you can check the documentation of this python module.
Today, I will present in this tutorial two examples that highlight how to work with this python module.
The most basic approach is probably to use the Process class.
The Process class is very similar to the threading module’s Thread class.
It is also necessary to use the Manager because is responsible for coordinating shared information.
The source code is simple to understand and is commented on to see the intermediate steps.
Let's start with the first example that uses a function of adding two numbers in two processes.
import multiprocessing
def sum(a,b):
t=a+b
print ("sum is:",t)
if __name__ == '__main__':
# create process processing_001 with target function and args of the target function
processing_001 = multiprocessing.Process(target=sum, args=(7,6))
processing_002 = multiprocessing.Process(target=sum, args=(1,1))
# starting processing_001
processing_001.start()
# starting processing_002
processing_002.start()
#processes are started
# stop processing_001 until is complete with join
processing_001.join()
# stop processing_002 until is complete with join
processing_001.join()
# result is C:\Python364>python.exe multiprocessing_001.py
#sum is: 13
#sum is: 2
The second example solves the next problem of the engineer who checks the speed of accomplishment of the tasks performed by two robots.Three processes are created for each: robots and engineer.
All these processes are completed in the same dictionary resource using the Manager.
For each task performed by the robot (start/join processes), the robot finds a random execution rate (function random.random) that is then added to the result (result) with the robot name and execution speed.
Let's see the source code and the result:
import multiprocessing
from multiprocessing import Process, Manager
import os
import random
def robot1(result):
print("robot1 has ID process: {}".format(os.getpid()))
speed_robot1=random.random()
result["robot1"] = speed_robot1
print ("worker speed tasks:",speed_robot1)
#print (result)
def robot2(result):
print("robot2 has ID process: {}".format(os.getpid()))
speed_robot2=random.random()
result["robot2"] = speed_robot2
print ("worker speed tasks:",speed_robot2)
#print (result)
def engineer(result):
print("engineer has ID process: {}".format(os.getpid()))
for key, value in result.items():
print("Result: {}".format((key, value)))
# you can add code to sort the values and print
# for key, value in sorted(result.items()):
# print("Result: {}".format((key, value)))
if __name__ == '__main__':
# show the main process
print("the main ID process: {}". format(os.getpid()))
# create a share dictionary resouce
manager = multiprocessing.Manager()
result = manager.dict()
# the process starts for robot1
ro1 = multiprocessing.Process(target=robot1, args=(result,))
ro1.start()
# the process starts for robot2
ro2 = multiprocessing.Process(target=robot2, args=(result,))
ro2.start()
# stops the robot1 process
ro1.join()
# stops the robot2 process
ro2.join()
# create the engineer process
en = multiprocessing.Process(target=engineer, args=(result,))
# start the process for the engineer
en.start()
# stops the engineer's process
en.join()
The result is:C:\Python364>python.exe multiprocessing_002.py
the main ID process: 7816
robot1 has ID process: 6476
worker speed tasks: 0.48279764083908094
robot2 has ID process: 7560
worker speed tasks: 0.44408591959008503
engineer has ID process: 7000
Result: ('robot1', 0.48279764083908094)
Result: ('robot2', 0.44408591959008503)