← Datos y decisiones ETAPA 02 · 28 MIN

Prioridad y planificación

Decide cuál es el siguiente trabajo sin volver a ordenarlo todo.

Abrir en el laboratorio ↗

AL TERMINAR, PODRÁS

  • Explicar el invariante de un heap
  • Desempatar de forma determinista
  • Reconocer los compromisos de la inanición y la cancelación
Un heap solo abarata el siguiente elemento: el trabajo más urgente siempre está en la raíz.

Descripción del diagrama: 1 · urgente → 3; 1 · urgente → 2; 3 → 7; 3 → 4; 2 → 5; 2 → 9; Empates: (prioridad, orden de llegada)

Solo el siguiente elemento debe ser barato

Una cola de prioridad devuelve el elemento con mayor prioridad de planificación en lugar del más antiguo. heapq de Python usa un min-heap (montículo de mínimos): el elemento más pequeño está en la raíz y cada padre es menor o igual que sus hijos.

La colección completa no está ordenada. Insertar y quitar el mínimo toma tiempo logarítmico; consultarlo, tiempo constante. Un heap encaja con los trabajos diferidos porque Relay pregunta una y otra vez qué hora programada viene después, no necesita un reporte completamente ordenado.

Haz deterministas las prioridades iguales

Guarda una tupla con la clave de planificación, un número de secuencia creciente y el trabajo.

Python compara los campos de una tupla en orden. El número de secuencia conserva el orden de inserción entre claves iguales y evita que Python compare objetos de trabajo que quizá no se puedan ordenar. Para trabajo diferido, el worker además debe comparar la hora de vencimiento más cercana con la hora actual antes de ejecutarlo: sacar el trabajo programado más temprano no implica que ya esté listo.

En las pruebas (tests), trata el reloj como una entrada.

Python
import heapq

schedule = []
heapq.heappush(schedule, (10, 0, "email"))
heapq.heappush(schedule, (5, 1, "report"))
due_at, sequence, job = heapq.heappop(schedule)
print(due_at, job)

La equidad también es corrección

Si siempre llegan trabajos urgentes, el trabajo de baja prioridad puede no ejecutarse nunca.

Eso se llama inanición (starvation). Algunas políticas posibles son «envejecer» el trabajo en espera, reservar capacidad para cada prioridad o definir objetivos de servicio separados. Cada una cambia la promesa del planificador.

Quitar entradas arbitrarias de un heap también es menos cómodo que quitar el mínimo; una solución común es marcar las entradas canceladas, saltarlas después y reconstruir el heap de vez en cuando si se acumulan entradas obsoletas. Elegir una estructura de datos debe incluir estos comportamientos operativos y no solo la operación más simple del caso feliz.

ERROR FRECUENTE

Suponer que el arreglo que respalda un heap está totalmente ordenado, o permitir que prioridades iguales provoquen comparaciones entre objetos de trabajo incompatibles.

INTÉNTALO TÚ

Programa tres trabajos, dos con la misma hora de vencimiento. Agrega números de secuencia y muestra el orden exacto en que salen. Describe una política que evite la inanición de baja prioridad.

COMPROBACIÓN DE RECUERDO / APLICA LA IDEA

Decide en el laboratorio.

El checkpoint de dos preguntas, tus notas y tu progreso guardado están en el laboratorio. Gratis y sin cuenta.

Abrir en el laboratorio ↗

CONÉCTALO CON RELAY

Agrega trabajos diferidos a Relay usando un heap. Inyecta una hora actual falsa para que las pruebas de disponibilidad no esperen de verdad.