Aunque los hilos son útiles, para aplicaciones en red modernas, se suelen preferir enfoques basados en programación asíncrona, como asyncio
, ya que son más eficientes en términos de recursos y evitan algunos problemas inherentes a los hilos.
El uso de hilos (threads) en la programación de aplicaciones en red es una técnica común para manejar múltiples conexiones o tareas simultáneamente dentro de un programa. Los hilos permiten que una aplicación realice varias operaciones concurrentes, como manejar varias conexiones de clientes en un servidor, sin bloquear otras operaciones.
Aquí tienes un desglose de cómo se utilizan los hilos en aplicaciones en red:
Un hilo es la unidad más pequeña de procesamiento que puede ser programada por el sistema operativo. En Python, los hilos se gestionan mediante el módulo threading
. Cada hilo tiene su propia ejecución, pero comparte el mismo espacio de memoria con otros hilos en el mismo proceso.
A continuación, te muestro un ejemplo de un servidor de eco que utiliza hilos para manejar múltiples conexiones de clientes:
import socket
import threading
# Función para manejar a cada cliente
def handle_client(client_socket, client_address):
print(f"[NUEVA CONEXIÓN] Cliente conectado desde {client_address}")
while True:
try:
message = client_socket.recv(1024)
if not message:
print(f"[DESCONECTADO] Cliente {client_address} se ha desconectado.")
break
print(f"[RECIBIDO] {client_address}: {message.decode('utf-8')}")
client_socket.sendall(message) # Enviar de vuelta el mensaje recibido (Eco)
except ConnectionResetError:
print(f"[ERROR] Conexión con {client_address} terminada inesperadamente.")
break
client_socket.close()
# Configuración del servidor
def start_server(host='127.0.0.1', port=5555):
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server_socket.bind((host, port))
server_socket.listen(5)
print(f"[ESCUCHANDO] Servidor en {host}:{port}")
while True:
client_socket, client_address = server_socket.accept()
# Crear un hilo para manejar al cliente
client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address))
client_thread.daemon = True # Terminar hilo al cerrar el programa principal
client_thread.start()
print(f"[HILOS ACTIVOS] {threading.active_count() - 1}")
if __name__ == "__main__":
start_server()
Servidor TCP:
socket.socket
para crear un servidor TCP.Manejo de clientes con hilos:
threading.Thread
.handle_client
gestiona la comunicación con el cliente.Concurrencia:
threading.Lock
.asyncio
.