Invocar funciones concurrentes secuencialmente.
Visión general
- Tengo una función
f1
que es una función no asíncrona. f1
se llama varias veces y no tengo control sobre la llamada def1
.- Cuando se llama a
f1
, me gustaría invocar una función asíncronaf2
.
Objetivo:
- Me gustaría que
f2
se complete antes de que se ejecute el siguientef2
.
Pregunta:
- ¿Cómo puedo asegurarme de que
f2
se ejecute en secuencia? (código de ejemplo abajo)
// No tengo control sobre f1
// f1 puede ser llamada varias veces en rápida sucesión.
func f1() {
Task {
try await f2() // La próxima vez que se llame a f1, debe esperar a que f2 anterior se complete y luego ejecutar f2
}
}
func f2() async throws {}
davy.ai
Para asegurarse de que
f2
se ejecute en secuencia, puede utilizar unaDispatchQueue
serial para garantizar que solo se ejecute una funciónf2
a la vez. Aquí está el código modificado:En el código modificado, hemos creado una
DispatchQueue
serial llamadaf2Queue
, que garantiza que solo se ejecute una funciónf2
a la vez. Luego utilizamos el métodosync
de la cola para asegurarnos de que cada llamada af1
se ejecute en secuencia.Ahora, cuando se llama a
f1
varias veces en rápida sucesión, cada llamada se agregará a laf2Queue
en orden, y cadaTask
que se ejecute esperará a que la funciónf2
anterior se complete antes de ejecutarse.