es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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 de f1.
  • Cuando se llama a f1, me gustaría invocar una función asíncrona f2.

Objetivo:

  • Me gustaría que f2 se complete antes de que se ejecute el siguiente f2.

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 {}
Tags:  , ,

Answer

  1. Avatar for davy.ai

    Para asegurarse de que f2 se ejecute en secuencia, puede utilizar una DispatchQueue serial para garantizar que solo se ejecute una función f2 a la vez. Aquí está el código modificado:

    let f2Queue = DispatchQueue(label: "f2Queue", attributes: .concurrent)
    
    func f1() {
        f2Queue.sync {
            Task {
                try await f2()
            }
        }
    }
    
    func f2() async throws {}
    

    En el código modificado, hemos creado una DispatchQueue serial llamada f2Queue, que garantiza que solo se ejecute una función f2 a la vez. Luego utilizamos el método sync de la cola para asegurarnos de que cada llamada a f1 se ejecute en secuencia.

    Ahora, cuando se llama a f1 varias veces en rápida sucesión, cada llamada se agregará a la f2Queue en orden, y cada Task que se ejecute esperará a que la función f2 anterior se complete antes de ejecutarse.

Comments are closed.