DEV Community

GoyesDev
GoyesDev

Posted on

[SC] Puntos de suspensión de una Task

Preguntas

¿Qué es exactamente un punto de suspensión en una tarea de Swift?

Un punto de suspensión es un momento donde una Task puede pausar su ejecución para permitir que otro trabajo pueda ejecutarse.

Cada uso de await es un punto de suspensión potencial.

¿Por qué no todo await garantiza una suspensión real?

Si la tarea esperada (await) puede ser completada de forma síncrona, la tarea de origen no se suspende sino que seguirá ejecutando inmediatamente. Esto puede ocurrir cuando el método asíncrono pertenece al mismo dominio de aislamiento. await simplemente marca un posible punto de suspensión, no uno garantizado.

¿Qué es la reentrada de actores y cuándo ocurre?

Un actor garantiza que solo una Task puede acceder a su estado aislado a la vez. Sin embargo, si una tarea encuentra un punto de suspensión dentro del actor, existe la posibilidad de que otra tarea empiece a trabajar con el actor antes de que la primera termine.

¿Qué riesgos concretos introduce un punto de suspensión dentro de un actor?

Todo estado mutable que asume una ejecución ininterrumpida podría comportarse de forma incorrecta si la tarea es suspendida. Esto puede derivar en un estado inconsistente porque podría solaparse con otra tarea que podría mutar el estado del actor antes de que la primera termine.

¿Cómo se puede evitar el comportamiento inesperado por reentrada?

  • Evitar modificar el estado mutable de un actor después de un punto de suspensión.
  • Guardar información importante para el desarrollo del método en variables locales.

¿Qué cambia exactamente en la versión corregida del método deposit?

El punto de suspensión aparece después de modificar el estado del actor. Todas las modificaciones al estado del actor se agrupan antes del await.

// Antes
func deposit(amount: Int) async {
  balance += amount
  print("[\(balance)] Deposited \(amount), balance is now \(balance)")

  await logTransaction(amount) // ⚠️ Suspension point

  balance += 10 // bonus after logging
  print("[\(balance)] Applied bonus, balance is now \(balance)")
}
Enter fullscreen mode Exit fullscreen mode
// Después
func deposit(amount: Int) async {
  balance += amount
  print("[\(balance)] Deposited \(amount), balance is now \(balance)")

  balance += 10 // bonus after logging
  print("[\(balance)] Applied bonus, balance is now \(balance)")
  await logTransaction(amount) // ⚠️ Suspension point
}
Enter fullscreen mode Exit fullscreen mode

Recitación / comprensión

Explica con tus propias palabras por qué el balance pasa de 100 → 200 en lugar de 100 → 110.

¿Cuál es la diferencia entre un punto de suspensión posible y uno garantizado?

¿Por qué mover el await al final del método soluciona el problema de reentrada?


Revisión y síntesis

¿Cuál es la regla práctica más importante para mutar el estado de un actor de forma segura?

¿En qué situaciones de tu propio código deberías revisar dónde caen los puntos de suspensión?

¿Qué tema cubre la siguiente lección y cómo se relaciona con lo aprendido aquí?


Bibliografía

Top comments (0)