01 · Punto de partida
Nadie espera el tick de todos
En el Tema 16 todos decidían sobre la misma foto y cambiaban juntos. Pero en la calle nadie congela el mundo para pensar: cada peatón, conductor o comerciante actúa cuando le toca, viendo lo que el anterior ya cambió. La actualización asíncrona turna de a un agente con estados frescos y mixtos.
Ese realismo cobra un precio: el resultado depende del orden. El primero corre con ventaja y dos corridas con el mismo sorteo distinto cuentan historias distintas.
- ¿De a cuántos cambian por vez: todos o uno?
- ¿En qué orden turnan: fijo de lista o sorteado?
- ¿Ven la foto vieja o lo recién cambiado?
- ¿Cuántas réplicas hacen falta para promediar el sorteo?
02 · Definición
Turno, orden y frescura
Toda ronda asíncrona combina quién juega, en qué secuencia y con qué datos:
Turno
Un agente actualiza solo con su regla y publica al instante. Un barrido son N turnos: cada uno jugó una vez.
Secuencial
Orden fijo de lista: 0, 1, 2… siempre igual. Simple de depurar, pero privilegia al primero en cada barrido.
Aleatorio
Orden sorteado en cada barrido: permutación nueva por ronda. Empareja ventajas y exige réplicas y semilla.
| Mundo | Turno | Orden típico |
|---|---|---|
| Tráfico | un conductor frena y el de atrás lo ve | secuencial por posición |
| Mercado | una compra mueve el precio al instante | aleatorio por llegada |
| Schelling | una mudanza cambia el barrio ya | aleatorio para no sesgar |
| Evacuación | un paso libera su baldosa ya | aleatorio por barrido |
03 · Órdenes
Fijo que privilegia frente a sorteado que empareja
El orden fijo siempre favorece a los mismos; el sorteo reparte la ventaja pero agrega azar que hay que promediar.
Orden secuencial
La lista manda
Siempre juega 0 primero: for i in range(N). La ola corre más rápido hacia adelante que hacia atrás y el sesgo se repite idéntico.
Orden aleatorio
El sorteo manda
Cada barrido permuta: shuffle(orden). Ningún agente juega siempre primero, pero cada réplica arma otra historia.
- Barrido
- Unidad de tiempo async: N turnos donde cada agente jugó una vez. Equivale en costo a una ronda síncrona.
- Permutación
- Orden sorteado del barrido. Se genera con semilla para repetir la historia (Temas 42–43).
- Frescura
- Cuánto de lo que ve es recién cambiado. Async ve fresco; sync ve foto vieja (Tema 16).
- Sesgo de orden
- Ventaja sistemática del que juega antes. Se detecta comparando secuencial contra aleatorio.
04 · Ciclo
El barrido que turna de a uno
Cada barrido ordena y actualiza in-place, en este orden:
- 1Ordenar el barrido.
Lista fija o permutación sorteada con semilla: ese es el turno de esta ronda.
- 2Actualizar uno.
Cada agente lee vecinos frescos y viejos mezclados y decide con lo que hay.
- 3Publicar al instante.
El cambio queda visible para el siguiente turno del mismo barrido, sin esperar tick.
05 · Representación en Python
Un arreglo que se pisa a propósito
Acá in-place es la regla, no el bug: se lee y escribe el mismo arreglo siguiendo el orden del barrido.
Python en tu navegador. Compará el barrido fijo contra el sorteado y observá quién se adelanta.
# Secuencial: siempre 0 primero, ventaja fija
cadena = [True, False, False, False]
for i in [0, 1, 2, 3]:
if cadena[i - 1]:
cadena[i] = True
print(cadena)
En un barrido ya hay 4 activos: el turno encadena contagios dentro de la misma ronda, a diferencia del Tema 16.
Sorteado con semilla
Cada barrido permuta el orden y se puede repetir con la misma semilla.
import random
random.seed(7)
cadena = [True, False, False, False]
orden = [0, 1, 2, 3]
random.shuffle(orden)
for i in orden:
if cadena[i - 1]:
cadena[i] = True
print(orden, cadena)
06 · Exploración
Laboratorio: el mismo anillo, otro turno
El mismo anillo del Tema 16, pero por turnos: en cada barrido cada agente juega una vez viendo lo recién cambiado. Con secuencial la ola corre más hacia adelante; con aleatorio avanza a saltos según el sorteo. ¿Cuánto más rápido que el reloj parejo?
El turno acelera la ola
turno(i) con vecinos frescos
En secuencial la ola encadena varios por barrido.
El mismo anillo del experimento 16: amarillo activo, verde aún no. En secuencial el avance es direccional; en aleatorio depende del sorteo de cada barrido. Pulsá Nueva réplica para otro sorteo.
Preguntas para explorar
- Con 1 barrido secuencial en anillo de 30 con 1 foco, ¿cuántos activos hay? ¿Por qué más que los 3 del síncrono?
- Cambiá a aleatorio con los mismos barridos. ¿El avance es simétrico? Repetilo 3 veces: ¿da siempre lo mismo?
- ¿Qué orden elegirías para una fila de mercado y cuál para una bandada? ¿Por qué el orden es parte del fenómeno?
Ver respuestas sugeridas
- Todo el anillo hacia adelante: el turno encadena y cada nuevo contagia al siguiente en el mismo barrido. Lo fresco acelera.
- No: el sorteo arma cadenas de distinta longitud por lado y cada réplica da otro total. Por eso async se promedia, no se muestra una vez.
- Fila con llegada: secuencial por posición o aleatorio por arribo. Bandada sin jefe: aleatorio para no privilegiar siempre al mismo.
07 · Comprensión
Confusiones frecuentes
«Async es sync desprolijo»
Son modelos distintos: uno congela foto con reloj, el otro encadena turnos con frescura. Cambiar uno por otro cambia velocidades y patrones.
«El orden da igual si hay azar»
El orden es azar con memoria: fijo privilegia siempre a los mismos, sorteado reparte pero exige réplicas. Declararlo es obligatorio.
«Un barrido async equivale a una ronda sync»
Cuesta lo mismo (N turnos) pero avanza distinto: async encadena varios vecinos por barrido y sync uno por ronda. No se comparan 1 a 1 sin esa corrección.
«Con una corrida alcanza»
Con sorteo una corrida es una historia. El resultado async es promedio y dispersión de réplicas con semilla (Tema 42).
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: encadenar en un barrido
Ejecutá el barrido secuencial y verificá cuántos se activan. Luego compará con el doble buffer del Tema 16.
cadena = [True, False, False, False, False]
for i in range(len(cadena)):
if cadena[i - 1]:
cadena[i] = True
print(cadena)
Ver solución razonada
Da 5 en 1 barrido contra 2 en 1 ronda síncrona: lo fresco encadena. La diferencia es el turno, no la regla.
Ejercicio 2: predecir el sorteo
Sin ejecutar primero: orden [2, 0, 3, 1] sobre [True, False, False, False]. ¿Cuántos se activan en ese barrido?
cadena = [True, False, False, False]
for i in [2, 0, 3, 1]:
if cadena[i - 1]:
cadena[i] = True
print(cadena)
Ver solución
Quedan [True, True, False, False]: el 2 jugó antes de que el 1 se activara y perdió su chance hasta el próximo barrido. El turno decide.
Ejercicio 3: barrido que equivale
Un barrido async son N turnos. ¿Cuántos turnos hay en 5 barridos de 40 agentes? ¿A cuántas rondas sync equivale en costo?
Ver una posible respuesta
print(5 * 40)
Hay 200 turnos: equivale en costo a 5 rondas sync, pero avanza más por encadenar. Costo igual, velocidad distinta.
09 · Síntesis
Ideas para recordar
- Asíncrona es ordenar, actualizar uno y publicar ya: cada turno ve mezcla fresca.
- Secuencial privilegia siempre a los mismos; aleatorio reparte con sorteo y semilla.
- Un barrido son N turnos: cuesta como una ronda sync pero encadena más lejos.
- El orden es parte del modelo: se declara, se justifica y se prueba la alternativa.
- En Python, in-place con orden explícito y promedio de réplicas con semilla.
En el próximo tema estudiaremos las reglas locales: decisiones simples con información cercana.