Apuntes_Python/02_conceptos/17_multiprocessing
2022-12-24 22:41:20 -03:00
..
a_ejemplo_multiprocessing_value.py init Apuntes Python 2022-12-24 22:41:20 -03:00
b_ejemplo_multiprocessing_array.py init Apuntes Python 2022-12-24 22:41:20 -03:00
c_ejemplo_multiprocessing_queue.py init Apuntes Python 2022-12-24 22:41:20 -03:00
d_ejemplo_multiprocessing_pool.py init Apuntes Python 2022-12-24 22:41:20 -03:00
README.md init Apuntes Python 2022-12-24 22:41:20 -03:00

Multiprocessing

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]