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.

¿Existe alguna diferencia entre utilizar GlobalScope.launch y CoroutineScope().launch para lanzar una coroutine?

Hay diferentes formas de lanzar una corrutina en Kotlin. Encontré un par de ejemplos donde se usan GlobalScope y CoroutineScope. Pero este último se crea directamente al lanzar una corrutina:

  1. Utilizando GlobalScope:

    fun loadConfiguration() {
    GlobalScope.launch(Dispatchers.Main) {
    val config = fetchConfigFromServer() // solicitud de red
    updateConfiguration(config)
    }
    }

    1. Utilizando instancias de CoroutineScope, creadas directamente al lanzar una corrutina:

      fun loadConfiguration() {
      CoroutineScope(Dispatchers.Main).launch {
      val config = fetchConfigFromServer() // solicitud de red
      updateConfiguration(config)
      }
      }

En este caso, ¿hay alguna diferencia entre estos dos enfoques?

¿No viola el segundo caso el principio de concurrencia estructurada?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Sí, hay una diferencia entre usar GlobalScope y crear directamente un CoroutineScope al lanzar un coroutine. El GlobalScope es una instancia global y única de CoroutineScope, que ejecuta coroutines que no tienen un propietario o tiempo de vida específico. Por otro lado, al crear directamente un CoroutineScope al lanzar un coroutine se crea una instancia local de CoroutineScope, que tiene un tiempo de vida específico y puede cancelarse cuando ya no sea necesario.

    El segundo enfoque viola el principio de concurrencia estructurada, que establece que cada coroutine debe ser lanzado en el contexto de un CoroutineScope que define su tiempo de vida. Al usar GlobalScope, las coroutines pueden sobrevivir al ciclo de vida de la función o actividad que las llama, lo que puede llevar a posibles fugas de memoria o comportamiento inesperado. Crear una instancia local de CoroutineScope asegura que el coroutine se cancele cuando ya no sea necesario, y su comportamiento sea predecible y controlado. Por lo tanto, se recomienda usar el segundo enfoque y crear un CoroutineScope directamente al lanzar un coroutine.

Comments are closed.