# Multiprocessing - Crear y detener procesos - Compartir datos entre procesos. - [Uso de 'lock' para prevenir 'race-conditions'](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/17_multiprocessing#lock) - [Uso de 'queue'](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/17_multiprocessing#queue) - [Pool/Administrar multiples procesos](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/17_multiprocessing#pool) ## Lock ```python from multiprocessing import Process, Value, Lock import time def add_100(numero, lock): for i in range(100): time.sleep(0.01) with lock: numero.value += 1 if __name__ == "__main__": lock = Lock() nro_compartido = Value('i', 0) print('el número al comienzo es', nro_compartido.value) p1 = Process(target=add_100, args=(nro_compartido, lock)) p2 = Process(target=add_100, args=(nro_compartido, lock)) p1.start() p2.start() p1.join() p2.join() print('el número al final es', nro_compartido.value) # el número al comienzo es 0 # el número al final es 200 ``` ## Array ```python from multiprocessing import Process, Array, Lock import time def add_100(numeros, lock): for i in range(100): time.sleep(0.01) for i in range(len(numeros)): with lock: numeros[i] += 1 if __name__ == "__main__": lock = Lock() array_compartido = Array('d', [0.0, 100.0, 200.0] ) # double print('Arreglo al comienzo: ', array_compartido[:]) p1 = Process(target=add_100, args=(array_compartido, lock)) p2 = Process(target=add_100, args=(array_compartido, lock)) p1.start() p2.start() p1.join() p2.join() print('Arreglo al final: ', array_compartido[:]) # Arreglo al comienzo: [0.0, 100.0, 200.0] # Arreglo al final: [200.0, 300.0, 400.0] ``` ## Queue ```python from multiprocessing import Process, Array, Lock, Queue import time def cuadrado(numeros, queue): for i in numeros: queue.put(i*i) def hacer_negativo(numeros, queue): for i in numeros: queue.put(-1*i) if __name__ == "__main__": numeros = range(1,6) q = Queue() p1 = Process(target=cuadrado, args=(numeros, q)) p2 = Process(target=hacer_negativo, args=(numeros, q)) p1.start() p2.start() p1.join() p2.join() while not q.empty(): print(q.get()) # 1 # 4 # 9 # 16 # 25 # -1 # -2 # -3 # -4 # -5 ``` ## Pool ```python from multiprocessing import Pool def cubo(numero): return numero * numero * numero if __name__ == "__main__": numeros = range(10) pool = Pool() # map, apply, join, close result = pool.map(cubo, numeros) # pool.apply(cubo, numeros[0]) pool.close() pool.join() print(result) # [0, 1, 8, 27, 64, 125, 216, 343, 512, 729] ```