Hay diferentes formas de lanzar una rutina en Kotlin. Encontré un par de ejemplos donde se GlobalScope y CoroutineScope . Pero este último se crea directamente al iniciar una corrutina:
Uso GlobalScope :
fun loadConfiguration() { GlobalScope.launch(Dispatchers.Main) { val config = fetchConfigFromServer() // network request updateConfiguration(config) } } Usando instancias de CoroutineScope , creadas directamente al iniciar una rutina:
fun loadConfiguration() { CoroutineScope(Dispatchers.Main).launch { val config = fetchConfigFromServer() // network request updateConfiguration(config) } }En este caso, ¿hay alguna diferencia entre estos dos enfoques?
¿El segundo caso no viola el principio de concurrencia estructurada ?
¿El segundo caso no viola el principio de concurrencia estructurada?
En realidad, ambos casos lo violan por igual, porque tienen prácticamente la misma semántica. Todas las advertencias contra el uso GlobalScope.launch que puede haber encontrado, se aplican a CoroutineScope().launch de la misma manera. Una ligera diferencia es que este último no tiene ningún sentido, mientras que el primero tiene al menos algunos casos de uso legítimos.
Escribir CoroutineScope().launch en lugar de GlobalScope.launch oscurece la intención y las consecuencias, además de crear un objeto innecesario cada vez.
Creo que el CoroutineScope().launch surgió únicamente porque eludió las advertencias que recibe para GlobalScope.launch .