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)")
}
// 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
}
Top comments (0)