TM275 - Meeting 2# Parallel Programming (Hands on) Using Python (Multiprocessing Library)
TM275 - Meeting 2# Parallel Programming (Hands on) Using Python (Multiprocessing Library)
Distributed Systems
Dr. Eng. Khouloud Samrouth & Dr. Rawad Abdulghafor
Make sure to
check this option
4
Installation
• Open the CMD
• Verify if python is added to “variables env. Path”
5
Installation
• Add python to “variables env. Path”
6
Python IDLE
7
Python IDLE Editor
• IDLE development environment:
• Shell for interactive evaluation.
• Text editor with color-coding and smart indenting for creating python files.
• Menu commands for changing system settings and running files.
• Search for “IDLE” from the start menu
8
.py
9
Run file.py
• py path_to_file\filename.py
10
Introduction
12
Process
• A process is a program being executed by a computer
13
Parent Process – Child Process
14
Parallel Programming
with Python
16
Parallel Programming with
Python
17
Parallel Programming with
Python
• Create Process
p = multiprocessing.Process(target=function_name,
args=(10, ))
• target: function name to be executed by the process
• args: arguments to be passed to the function
Create Wait till the
Define Run
different completion of
functions processes processes
processes
18
Parallel Programming with
Python
• Run the process
p.start()
• Once the processes are started, the current program also continues to run.
• To stop running the current program until a process is completed:
• p.join()
19
Parallel Programming with
Python– Example 1
• Create a “print_cube” function that prints the cube of a
number on the screen.
• Create a “print_carre” function which prints the square
of a number on the screen.
• Run 2 functions in parallel Show “Done! » once the 2
functions finish.
20
Parallel Programming with
Python – Example 1
if __name__ == '__main__':
# import the multiprocessing
module # creer les processus
import multiprocessing p1 = multiprocessing.Process(target=print_square,
args=(10, ))
def print_cube(num):
p2 = multiprocessing.Process(target=print_cube,
"""
args=(10, ))
function that prints on the screen the cube of a number
""" # run process 1
print(Cube« S: {}".format(num * num * num)) p1.start()
# run process 2
p2.start()
p1.join()
p2.join()
p3.join()
print("Done!")
22
Parallel Programming with
Python
• Get Process ID
• os.getpid()
• Process_name.pid
23
Parallel Programming with
Python– Exercise
• Create the functions “worker 1” and “worker 2” which
print the pid of their process on the screen.
• Use the os.getpid() function
• Run 2 functions in parallel
• Display the IDs of the parent process and the 2 child
processes outside of functions
• Show “Done! » once the 2 functions finish.
24
Parallel Programming with
Python - Example 3
import multiprocessing
25
Programmation Parallèle avec
Python - Example 3
26
Sharing Memory between Processes
• multiprocessing.Shared Memory
27
Sharing Memory between Processes
• multiprocessing.Shared Memory
• provides Array and Value objects to share data between
processes
• Array: a ctypes array allocated from shared memory.
• Value: a ctypes object allocated from shared memory.
28
Sharing Memory between Processes
– Shared Memory
1. Create an array or avaleur
ar1 = multiprocessing.Array(data_type, array_size)
‘i’: int
‘d’ : float
29
Sharing Memory between Processes
– Shared Memory
2. Pass ar1 and val1 as arguments while creating
processes
p1 = multiprocessing.Process(target=function_name,
args=(argument, ar1 , val1))
30
Sharing Memory between Processes
– Shared Memory
3. Acccess elements of ar1 and val1
ar1[indice]
val1.value
31
Sharing Memory between Processes
– Shared Memory – Example 4
• Adopting Example 3 if __name__ == "__main__":
# input list
from multiprocessing import Process, Array, value mylist = [1,2,3,4]
Le module multiprocessing fournit une classe Manager qui contrôle un processus serveur..
Un processus serveur peut contenir des objets Python et permettre à d'autres processus de les manipuler à l'aide de proxys.
TM275 - Parallel Programming with Python
Par conséquent, les Managers fournissent un moyen de créer des données qui peuvent être partagées
33
entre différents processus.
Partage de Mémoire entre les
processus- Server Process
1- Créer un objet manager
manager = multiprocessing.Manager()
34
Sharing Memory between Processes
– Server Process
2 – créer une liste dans la memoire du server process
server_list = manager.list([])
35
Sharing Memory between Processes
– Server Process
3- Passer server_list/server_dict dans les arguments du
processus
P1 = multiprocessing.Process(target = nom_function,
args =(argument_function, server_list)
36
Sharing Memory between Processes
– Server Process - Example
(Nom, Score)
37
Sharing Memory between Processes
– Server Process - Example
import multiprocessing
def print_records(records):
"""
function to print element(tuples) dans records(list)
"""
for element in records:
print("Nom: {0}\nScore: {1}\n".format(element[0], element[1]))
38
Sharing Memory between Processes
– Server Process - Example
# creating new processes
p1 = multiprocessing.Process(target=ajouter_element,
if __name__ == '__main__': args=(new_record, records))
#with multiprocessing.Manager() as manager: p2 = multiprocessing.Process(target=print_records,
manager = multiprocessing.Manager() args=(records,))
39
Communication entre les
processus
• L'utilisation efficace de plusieurs processus nécessite généralement une
certaine communication entre eux, de sorte que le travail peut être divisé et
les résultats peuvent être agrégés.
• « multiprocessing » prend en charge deux types de canaux de communication
entre processus :
Queue Pipe
40
Communication entre les
processus - Queue
• Creer une multiplocessing Queue
• q = multiprocessing.Queue()
• Mettre dans la queue
• q.put()
q.put() q.get()
16 9 4 1 2
• Lire de la queue
• q.get()
• Verifier si la queue est vide
• q.empty()
41
Communication entre les
processus – Queue - Example
Imprimer le contenu de la
queue TM275 - Parallel Programming with Python
42
Communication entre les
processus – Queue - Example
import multiprocessing if __name__ == "__main__":
# input list
def square_list(mylist, q): mylist = [1,2,3,4]
"""
function to square a given list # creating multiprocessing Queue
""" q = multiprocessing.Queue()
# append squares of mylist to queue # creating new processes
for num in mylist: p1 = multiprocessing.Process(target=square_list, args=(mylist, q))
q.put(num * num) p2 = multiprocessing.Process(target=print_queue, args=(q,))
def print_queue(q):
""" # running process p1 to square list
function to print queue elements p1.start()
""" p1.join()
print("Queue elements:")
# running process p2 to get queue elements
while not q.empty():
p2.start() TM275 - Parallel Programming with Python
print(q.get())
p2.join()
print("Queue is now empty!") 43
Communication entre les
processus - Pipes
• Créer une Pipe
• parent_conn, child_conn = multiprocessing.Pipe()
• Retourne 2 objects représentant les 2 points de
communication de la pipe
• Envoyer un message
• Conn.send(message)
Conn 1 9 4 1 Conn
• Recevoir le message A B
• message = conn.recv()
44
Communication entre les
processus – Pipes - Example
45
Communication entre les
processus – Pipes - Example
import multiprocessing
def imprimer_elements_recus(child_conn):
""" Fonction pour imprimer les elements reçus de la pipe """
while True:
msg = child_conn.recv()
if (msg=='END'):
print("Fin!") TM275 - Parallel Programming with Python
break 46
print("{} reçu".format(msg))
Communication entre les
processus – Pipes - Example
if __name__ == "__main__":
48
Processus Concurrents
• Des accès simultanés à des ressources partagées peuvent entraîner des
situations de concurrence.
• Une concurrence se produit lorsque deux processus ou plus peuvent accéder à
des données partagées et tentent de les modifier en même temps.
• Par conséquent, les valeurs des variables peuvent être imprévisibles et varier
en fonction des horaires des changements de contexte des processus.
49
Processus Concurrents – Example
def perform_transactions():
# Python program to illustrate
# the concept of race condition # balance initiale (dans shared memory)
# in multiprocessing balance = multiprocessing.Value('i', 100)
import multiprocessing
# creer nouveaux processus
# fonction pour le retrait de compte p1 = multiprocessing.Process(target=retrait, args=(balance,))
def retrait(balance): p2 = multiprocessing.Process(target=depot, args=(balance,))
for _ in range(10000):
balance.value = balance.value - 1 # starting processes
p1.start()
p2.start()
# fonction pour le depot dans compte # wait until processes are finished
def depot(balance): p1.join()
for _ in range(10000): p2.join()
balance.value = balance.value + 1 TM275 - Parallel Programming with Python
52
Synchronisation entre les Processus
avec Python - Locks
Créer
• lock = multiprocessing.Lock()
un
Lock
Passe
r le
lock
en
argu
• p1 = multiprocessing.Process(target=withdraw, args=(balance,lock))
ment
Appli
de
quer la
functi
le
on
lock
target
dans
la
• lock.acquire()
sectio • Dès qu'un verrou est acquis, aucun autre processus ne peut accéder à sa section critique tant que le verrou n'est pas libéré
n
critiq
ue de
la
functi
on
Libere
target
• lock.release()
r le
Lock
53
Pooling des Processus avec Python
if __name__ == "__main__":
# input list
mylist = [1,2,3,4,5]
print(result)
Un seul des cores est utilisé pour Utiliser les différents cores
[1, 4, 9, 16, 25] l'exécution du programme et il est tout à
fait possible que d'autres coers restent
inactifs. TM275 - Parallel Programming with Python
54
Pooling des Processus avec Python
• La tâche est déchargée/distribuée automatiquement entre les
cœurs/processus par l'objet Pool.
• L'utilisateur n'a pas à se soucier de la création explicite de processus.
56
Pooling des Processus avec Python
2-mapper à une fonction.
• result = p.map(nom_fonction, mylist)
57
Pooling des Processus avec Python –
Example
import multiprocessing
def square(n):
return n*n
if __name__ == "__main__":
#liste d'entree
my_list = [1,2,3,4]
#creer pool
pool = multiprocessing.Pool()
# map list to target function
result = pool.map(square, my_list)
58
Merci
End of Meeting 2
Thank you
TM275 - Parallel Programming with Python
61