2.9 KiB
2.9 KiB
Multiprocessing
- Crear y detener procesos
- Compartir datos entre procesos.
- Uso de 'lock' para prevenir 'race-conditions'
- Uso de 'queue'
- Pool/Administrar multiples procesos
Lock
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
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
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
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]