# Threading - [Memoria compartida entre hilos](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/16_multithreading#compartiendo-memoria-entre-hilos) - [Queue/Cola](https://gitea.kickto.net/devfzn/Apuntes_Python/src/branch/master/02_conceptos/16_multithreading#queue) ### Compartiendo memoria entre hilos Como 'habitan' el mismo espacio de memoria, todos los hilos tiene acceso a los mismos datos. ```python 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. ```python 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 ```