124 lines
2.8 KiB
Markdown
124 lines
2.8 KiB
Markdown
|
# 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
|
||
|
```
|