Apuntes_Python/02_conceptos/16_multithreading
2024-01-16 12:23:41 -03:00
..
a_ejemplos_threading.py init Apuntes Python 2022-12-24 22:41:20 -03:00
b_queue_threading.py init Apuntes Python 2022-12-24 22:41:20 -03:00
README.md ed: domain links on files <kickto.net >letz.dev 2024-01-16 12:23:41 -03:00

Threading

Compartiendo memoria entre hilos

Como 'habitan' el mismo espacio de memoria, todos los hilos tiene acceso a los mismos datos.

from threading import Thread, Lock
import time

valor_db = 0

def incrementar(lock):
    """
        Funcion de prueba que simula dato de bd

        with lock:
            ...

    """
    global valor_db
    # lock previene el acceso a dato por otro hilo al mismo tiempo
    #lock.acquire()
    with lock:
        copia_local = valor_db
        copia_local +=1
        time.sleep(0.1)
        valor_db = copia_local
    #lock.release()

if __name__ == "__main__":

    lock = Lock()
    print('Valor inicial', valor_db)

    hilo1 = Thread(target=incrementar, args=(lock,))
    hilo2 = Thread(target=incrementar, args=(lock,))

    hilo1.start()
    hilo2.start()

    hilo1.join()
    hilo2.join()

    print('Valor final', valor_db)
    print('Fin Main')

Queue

Queue (cola) es usado como metodo de seguridad en procesos e hilos
para entornos de intercambio de datos. Sigue los principios FIFO.

from threading import Thread, Lock, current_thread
from queue import Queue
import time

def worker(q):
    while True:
        valor = q.get()
        # procesando...
        with lock:
            print(f'{current_thread().name} tiene valor {valor}')
        q.task_done()

if __name__ == "__main__":

    q = Queue()

    # q.put(1)
    # q.put(2)
    # q.put(3)

    # 3 2 1 -->
    # first = q.get()
    # print(first)

    # q.not_empty()   # retorna True si la cola esta vacia
    # q.task_done()   # avisa que esta tarea esta liberada
    # q.join()        # bloqua el hilo principal hasta q se complete este hilo

    lock = Lock()
    num_hilos = 10

    for i in range(num_hilos):
        hilo = Thread(target=worker, args=(q,))
        # 'daemon thread' 'demoniza' el hilo. 
        # Lo termina cuando termina el hilo principal
        hilo.daemon=True
        hilo.start()

    # llenar cola con elementos
    for i in range(1, 21):
        q.put(i)

    q.join()

    print('Fin Main')

# Thread-1 tiene valor 1
# Thread-3 tiene valor 2
# Thread-4 tiene valor 3
# Thread-5 tiene valor 4
# Thread-6 tiene valor 5
# Thread-8 tiene valor 6
# Thread-7 tiene valor 7
# Thread-2 tiene valor 8
# Thread-9 tiene valor 9
# Thread-10 tiene valor 10
# Thread-1 tiene valor 11
# Thread-3 tiene valor 12
# Thread-4 tiene valor 13
# Thread-5 tiene valor 14
# Thread-6 tiene valor 15
# Thread-8 tiene valor 16
# Thread-7 tiene valor 17
# Thread-2 tiene valor 18
# Thread-9 tiene valor 19
# Thread-10 tiene valor 20
# Fin Main