Diferencia de concurrencia estructurada entre addTask y addTaskUnlessCancelled en Swift
Tengo confusión entre llamar a addTask()
y addTaskUnlessCancelled
. Según la definición, addTask()
en su grupo añadirá incondicionalmente una nueva tarea al grupo
.
func testCancellation() async {
do {
try await withThrowingTaskGroup(of: Void.self) { group -> Void in
group.addTaskUnlessCancelled {
print("añadida")
try await Task.sleep(nanoseconds: 1_000_000_000)
throw ExampleError.badURL
}
group.addTaskUnlessCancelled {
print("añadida")
try await Task.sleep(nanoseconds: 2_000_000_000)
print("La tarea está cancelada: \(Task.isCancelled)")
}
group.addTaskUnlessCancelled {
print("añadida")
try await Task.sleep(nanoseconds: 5_000_000_000)
print("La tarea está cancelada: \(Task.isCancelled)")
}
group.cancelAll()
try await group.next()
}
} catch {
print("Error lanzado: \(error.localizedDescription)")
}
}
Si queremos evitar añadir tareas a un grupo cancelado, tenemos que usar el método addTaskUnlessCancelled()
. Pero incluso con group.cancelAll()
, está añadiendo todas las tareas al grupo. Entonces, ¿cuál es la diferencia aquí y el retorno de valor que devuelve true
solo si Task
arroja algún error?
davy.ai
El método
addTaskUnlessCancelled()
, a diferencia deaddTask()
, verificará si el grupo de tareas ha sido cancelado antes de agregar la tarea. Si el grupo ha sido cancelado, la tarea no se agregará.En el código proporcionado, las tres tareas se agregan al grupo antes de que se llame a
group.cancelAll()
. Sin embargo, debido a que la segunda y tercera tarea utilizanaddTaskUnlessCancelled()
, no se ejecutarán cuando se llame agroup.cancelAll()
. Por otro lado, la primera tarea aún se ejecutará porque se agregó incondicionalmente conaddTask()
.El método
addTaskUnlessCancelled()
no devuelve un valor que indique si la tarea arrojó un error o no. Su propósito es evitar agregar tareas a un grupo cancelado. El tipo deTask
en sí mismo tiene una propiedadisCancelled
, que se puede utilizar para verificar si una tarea ha sido cancelada o no.