0Pricing
Python Academy · Lección

Hilos y el GIL

Comprenda las limitaciones de los hilos en Python

Hilos y el GIL es una lección gratuita de Python Academy en CoddyKit. Esta es la lección 1 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Python Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Python Academy incluye 4 lecciones en total.

¿Qué es un hilo?

Un hilo es un flujo de ejecución independiente dentro de un proceso. El módulo threading de Python permite ejecutar funciones de forma concurrente dentro de un solo programa.

import threading

def worker():
    print('hello from thread')

t = threading.Thread(target=worker)
t.start()
t.join()
print('main done')

Iniciar varios hilos

Puede iniciar varios hilos. Cada uno ejecuta su función objetivo. join() hace que el hilo principal espere hasta que termine un hilo.

import threading

def task(name):
    print('task', name)

threads = [threading.Thread(target=task, args=(i,)) for i in range(3)]
for t in threads:
    t.start()
for t in threads:
    t.join()
print('all finished')

El bloqueo global del intérprete

CPython tiene un bloqueo global del intérprete (GIL): solo un hilo ejecuta bytecode de Python a la vez. Esto significa que los hilos no proporcionan una aceleración paralela real para el trabajo de CPU escrito en Python puro.

import sys
print('Running on:', sys.implementation.name)
print('Only one thread runs Python bytecode at a time due to the GIL')

Cuándo siguen siendo útiles los hilos

Los hilos son ideales para trabajos limitados por E/S: solicitudes de red, lecturas de disco y esperas. Mientras un hilo espera, se libera el GIL y otro puede ejecutarse.

import threading, time

def fake_io(name):
    time.sleep(0.1)
    print('done', name)

start = time.perf_counter()
ts = [threading.Thread(target=fake_io, args=(i,)) for i in range(3)]
for t in ts: t.start()
for t in ts: t.join()
print('elapsed about 0.1s, not 0.3s')

El trabajo limitado por CPU no se acelera

Para cálculos intensivos, añadir hilos no los hará más rápidos porque el GIL los serializa. Para el trabajo de CPU, utilice multiprocessing.

import threading

def burn():
    total = 0
    for i in range(1000000):
        total += i
    return total

t = threading.Thread(target=burn)
t.start()
t.join()
print('CPU-bound: threads share one core under the GIL')

Hilos daemon

Un hilo daemon termina automáticamente cuando finaliza el programa principal. Utilícelo para tareas auxiliares en segundo plano que no necesite esperar.

import threading, time

def background():
    time.sleep(0.05)
    print('background tick')

t = threading.Thread(target=background, daemon=True)
t.start()
t.join()
print('main exits')

Asignar nombres e identificar hilos

Cada hilo tiene un nombre y un identificador. threading.current_thread() devuelve el objeto del hilo en ejecución, lo que resulta útil para los registros.

import threading

def show():
    t = threading.current_thread()
    print('running in', t.name)

t = threading.Thread(target=show, name='Worker-1')
t.start()
t.join()
print('main thread:', threading.current_thread().name)

Crear una subclase de Thread

En lugar de pasar un objetivo, puede crear una subclase de Thread y redefinir run(). Esto resulta útil cuando un hilo necesita mantener su propio estado.

import threading

class Greeter(threading.Thread):
    def __init__(self, name):
        super().__init__()
        self.who = name
    def run(self):
        print('hi', self.who)

g = Greeter('Sam')
g.start()
g.join()

Devolver resultados desde hilos

El valor devuelto por una función objetivo se descarta. Para recopilar resultados, escríbalos en una estructura compartida; más adelante verá herramientas más seguras, como las colas.

import threading

results = {}

def compute(key):
    results[key] = key * key

ts = [threading.Thread(target=compute, args=(i,)) for i in range(4)]
for t in ts: t.start()
for t in ts: t.join()
print(results)

Contar los hilos activos

threading.active_count() indica cuántos hilos están activos en ese momento, incluido el hilo principal.

import threading, time

def wait():
    time.sleep(0.05)

ts = [threading.Thread(target=wait) for _ in range(2)]
for t in ts: t.start()
print('active now:', threading.active_count())
for t in ts: t.join()
print('active after join:', threading.active_count())

Elegir entre hilos y procesos

Como regla general, utilice hilos para la concurrencia limitada por E/S y procesos para el paralelismo limitado por CPU. El motivo es el GIL.

tasks = {'download files': 'threads', 'crunch numbers': 'processes', 'call APIs': 'threads'}
for task, choice in tasks.items():
    print(task, '->', choice)

Comprobación rápida

Compruebe su comprensión de los hilos y el GIL.

Resumen

Ha aprendido sobre los hilos y el GIL:

  • Los hilos se ejecutan de forma concurrente dentro de un proceso mediante threading.Thread.
  • El GIL serializa la ejecución del bytecode de Python.
  • Los hilos ayudan con el trabajo limitado por E/S; los procesos, con el trabajo limitado por CPU.
  • Utilice start(), join(), hilos daemon y la creación de subclases.

A continuación: gestionar hilos correctamente con ThreadPoolExecutor.

Preguntas frecuentes

¿La lección «Hilos y el GIL» es gratis?

Sí — el texto completo de «Hilos y el GIL» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Python Academy, actualiza a CoddyKit PRO. El curso de Python Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Hilos y el GIL»?

Comprenda las limitaciones de los hilos en Python Practicas Python Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Python Academy?

No se requiere experiencia previa. Python Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 1 de 4.

¿Cuánto tiempo toma la lección «Hilos y el GIL»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Python Academy?

Sí. Cada lección de Python Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Hilos y el GIL
  2. ThreadPoolExecutor
  3. Conceptos básicos de multiprocessing
  4. Uso seguro de datos compartidos
← Volver a Python Academy