Add library exercises
This commit is contained in:
parent
d15f5b4eb6
commit
658f94c62b
39
python-ofensivo/08_librerias/05_threading.py
Normal file
39
python-ofensivo/08_librerias/05_threading.py
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
La librería threading nos permite crear hilos de ejecución en Python.
|
||||||
|
Un hilo es un flujo de ejecución separado que puede ejecutar código
|
||||||
|
simultáneamente con otros hilos de ejecución de nuestro programa.
|
||||||
|
|
||||||
|
Los hilos nos permiten ejecutar código concurrente en nuestro programa.
|
||||||
|
|
||||||
|
Es importante tener en cuenta que el uso de hilos puede introducir problemas de
|
||||||
|
concurrencia, como condiciones de carrera, por lo que debes tener cuidado al
|
||||||
|
manipular datos compartidos entre hilos.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import threading
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
def tarea(num_tarea):
|
||||||
|
|
||||||
|
print(f"\n[+] Hilo {num_tarea} iniciada")
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
print(f"\n[+] Hilo {num_tarea} finalizada")
|
||||||
|
|
||||||
|
# Configurar los hilos
|
||||||
|
thread1 = threading.Thread(target=tarea, args=(1,))
|
||||||
|
thread2 = threading.Thread(target=tarea, args=(2,))
|
||||||
|
|
||||||
|
# Iniciar los hilos
|
||||||
|
thread1.start()
|
||||||
|
thread2.start()
|
||||||
|
|
||||||
|
# Esperar a que los hilos terminen
|
||||||
|
thread1.join()
|
||||||
|
thread2.join()
|
||||||
|
|
||||||
|
print(f"\n[+] Los hilos han finalizado con éxito")
|
44
python-ofensivo/08_librerias/06_multiprocessing.py
Normal file
44
python-ofensivo/08_librerias/06_multiprocessing.py
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
La librería multiprocessing permite crear procesos en Python.
|
||||||
|
Cada proceso tiene su propio espacio de memoria, por lo que no comparten
|
||||||
|
variables.
|
||||||
|
Para comunicar procesos se utilizan tuberías (pipes) o colas (queues).
|
||||||
|
La librería multiprocessing también permite crear hilos (threads) con la clase
|
||||||
|
Thread. Los hilos son procesos ligeros que comparten memoria y recursos.
|
||||||
|
Los hilos se utilizan para ejecutar tareas en paralelo.
|
||||||
|
En este ejemplo se crean dos hilos que ejecutan la misma tarea.
|
||||||
|
La función time.sleep() se utiliza para simular una tarea que tarda un tiempo en
|
||||||
|
ejecutarse. La función join() se utiliza para esperar a que los hilos terminen.
|
||||||
|
La función join() bloquea el hilo principal hasta que los hilos terminan.
|
||||||
|
La función is_alive() se utiliza para comprobar si un hilo está en ejecución.
|
||||||
|
La función enumerate() se utiliza para obtener una lista de los hilos en
|
||||||
|
ejecución.
|
||||||
|
La función active_count() se utiliza para obtener el número de hilos en
|
||||||
|
ejecución.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import multiprocessing
|
||||||
|
import time
|
||||||
|
|
||||||
|
|
||||||
|
def tarea(num_tarea):
|
||||||
|
|
||||||
|
print(f"\n[+] Proceso {num_tarea} iniciada")
|
||||||
|
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
print(f"\n[+] Proceso {num_tarea} finalizada")
|
||||||
|
|
||||||
|
|
||||||
|
proceso1 = multiprocessing.Process(target=tarea, args=(1,))
|
||||||
|
proceso2 = multiprocessing.Process(target=tarea, args=(2,))
|
||||||
|
|
||||||
|
proceso1.start()
|
||||||
|
proceso2.start()
|
||||||
|
|
||||||
|
proceso1.join()
|
||||||
|
proceso2.join()
|
||||||
|
|
||||||
|
print(f"\n[+] Los procesos han finalizado")
|
@ -0,0 +1,91 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
"""
|
||||||
|
Ejemplo práctico para ver la diferencia entre ejecutar un programa con hilos, con procesos y
|
||||||
|
sin ninguno de los anteriores.
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
import time
|
||||||
|
import requests
|
||||||
|
import threading
|
||||||
|
import multiprocessing
|
||||||
|
|
||||||
|
dominios = {
|
||||||
|
"https://google.com",
|
||||||
|
"https://xvideos.com",
|
||||||
|
"https://wikimedia.org",
|
||||||
|
"https://yahoo.com"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Ejecución sin hilos ni procesos separados
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
for url in dominios:
|
||||||
|
|
||||||
|
r = requests.get(url)
|
||||||
|
print(
|
||||||
|
f"\n[+] URL {url}: {len(r.content)} bytes"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
end_time = time.time()
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\n[i] Tiempo de ejecución SIN hilos: {end_time - start_time} segundos\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def realizar_peticion(url):
|
||||||
|
|
||||||
|
r = requests.get(url)
|
||||||
|
print(
|
||||||
|
f"\n[+] URL {url}: {len(r.content)} bytes"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Ejecución con hilos
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
hilos = []
|
||||||
|
for url in dominios:
|
||||||
|
|
||||||
|
hilo = threading.Thread(
|
||||||
|
target=realizar_peticion,
|
||||||
|
args=(url,)
|
||||||
|
)
|
||||||
|
hilo.start()
|
||||||
|
hilos.append(hilo)
|
||||||
|
|
||||||
|
for hilo in hilos:
|
||||||
|
|
||||||
|
hilo.join()
|
||||||
|
|
||||||
|
end_time = time.time()
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\n[i] Tiempo de ejecución CON hilos: {end_time - start_time} segundos\n"
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
# Ejecución con procesos
|
||||||
|
start_time = time.time()
|
||||||
|
|
||||||
|
procesos = []
|
||||||
|
for url in dominios:
|
||||||
|
|
||||||
|
proceso = multiprocessing.Process(
|
||||||
|
target=realizar_peticion,
|
||||||
|
args=(url,)
|
||||||
|
)
|
||||||
|
proceso.start()
|
||||||
|
procesos.append(proceso)
|
||||||
|
|
||||||
|
for proceso in procesos:
|
||||||
|
|
||||||
|
proceso.join()
|
||||||
|
|
||||||
|
end_time = time.time()
|
||||||
|
|
||||||
|
print(
|
||||||
|
f"\n[i] Tiempo de ejecución CON procesos: {end_time - start_time} segundos\n"
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user