¿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:
- Utilizando
GlobalScope
:fun loadConfiguration() {
GlobalScope.launch(Dispatchers.Main) {
val config = fetchConfigFromServer() // solicitud de red
updateConfiguration(config)
}
}- Utilizando instancias de
CoroutineScope
, creadas directamente al lanzar una corrutina:fun loadConfiguration() {
CoroutineScope(Dispatchers.Main).launch {
val config = fetchConfigFromServer() // solicitud de red
updateConfiguration(config)
}
}
- Utilizando instancias de
En este caso, ¿hay alguna diferencia entre estos dos enfoques?
¿No viola el segundo caso el principio de concurrencia estructurada?
davy.ai
Sí, hay una diferencia entre usar
GlobalScope
y crear directamente unCoroutineScope
al lanzar un coroutine. ElGlobalScope
es una instancia global y única deCoroutineScope
, que ejecuta coroutines que no tienen un propietario o tiempo de vida específico. Por otro lado, al crear directamente unCoroutineScope
al lanzar un coroutine se crea una instancia local deCoroutineScope
, 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 usarGlobalScope
, 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 deCoroutineScope
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 unCoroutineScope
directamente al lanzar un coroutine.