Apuntes_Python/02_conceptos/16_multithreading/README.md

124 lines
2.8 KiB
Markdown
Raw Normal View History

2022-12-24 22:41:20 -03:00
# 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
```