Introducción a la función de selección en el paquete Kotlin Coroutines

En el trabajo, descubrí que kotlin Coroutineshay una gran cantidad de API muy poderosas en el paquete. En este artículo, hablaremos principalmente de selectfunciones .

1. ¿Cuál es la función de selección?

Imagine este escenario. En una aplicación de programa, para implementar una lógica de negocios, puede tener varias formas de implementarla, pero solo necesito la forma más rápida de lograr el resultado. En este momento podemos usar funciones select. Si aún no sabes lo que significa, podemos mirar la imagen a continuación:

El oro es relativamente caro recientemente. Nuestro cliente necesita consultar el precio del oro en tiempo real. Ahora tanto el servidor NetEase como el servidor Toutiao proporcionan interfaces de consulta al mismo tiempo. En teoría, los datos devueltos por el servidor NetEase y el servidor Toutiao Debería ser el mismo nodo al mismo tiempo. I En este momento, los datos de la solicitud se envían a los servidores NetEase y Toutiao al mismo tiempo, por lo que mi consulta en este momento solo necesita devolver los resultados lo más rápido posible. Para decirlo más claramente, podemos considerarlo como una carrera armamentista de datos. Por supuesto, utilizando nuestro conocimiento existente, es relativamente fácil completar esto: solo use dos subprocesos y agregue devoluciones de llamada, pero permítanme presentarles cómo usar la función de selección para hacer que la lógica sea más elegante.

2. Cómo utilizar

Pongamos un ejemplo sencillo: siguiendo la lógica anterior, comprobemos el precio del oro:

Defina dos funciones de simulación para simular la obtención de datos dorados de NetEase y Toutiao respectivamente:

private suspend fun requestNestGoldData() = withContext(Dispatchers.IO){
    
    
        Log.d("select","start to request nest gold data")
        delay(100)

        Log.d("select","get the nest gold data success")
        "nest_" + 600.00
}

private suspend fun requestByteDanceData() = withContext(Dispatchers.IO) {
    
    
        Log.d("select","start to request byte dance gold data")
        delay(300)

        Log.d("select","get the nest gold byte dance success")
        "bytedance_" + 600.00
}

Luego usamos la función de selección para vincular y obtener los datos:

viewModelScope.launch {
    
    

  val requestDataResult = select {
    
    

     async {
    
     requestNestGoldData() }.onAwait {
    
     it }

     async {
    
     requestByteDanceData() }.onAwait {
    
     it }

   }

   Log.d("select","get the result : $requestDataResult")
}

Entonces echemos un vistazo al registro de impresión:

2023-09-17 15:54:23.164 19063-19188 select   D  start to request nest gold data
2023-09-17 15:54:23.164 19063-19189 select   D  start to request byte dance gold data
2023-09-17 15:54:23.266 19063-19188 select   D  get the nest gold data success
2023-09-17 15:54:23.449 19063-19063 select   D  get the result : nest_600.0
2023-09-17 15:54:23.466 19063-19188 select   D  get the nest gold byte dance success

A través de los registros, descubrimos que requestNestGoldData()hicimos requestByteDanceData()solicitudes al mismo tiempo, pero selectsolo se devolvió el resultado más rápido. Por supuesto, la interfaz lenta aún se está ejecutando, pero el resultado se descarta.

3. Seguimiento

¿Qué debemos hacer si utilizamos devoluciones de llamada? Escribamos su implementación de pseudocódigo:

interface ResultListener {
    
    
  
  fun onResult(info String)
 
}

private suspend fun requestNestGoldDataWithListener(listner : Resultlistener) {
    
    
        runBlocking(Dispatchers.IO){
    
    
            Log.d("select","start to request nest gold data")
            delay(100)

            Log.d("select","get the nest gold data success")
            listner.onResult("nest_" + 600.00)
        }
}

private suspend fun requestByteDanceGoldDataWithListener(listner : Resultlistener) {
    
    
        runBlocking(Dispatchers.IO){
    
    
            Log.d("select","start to request byte dance gold data")
            delay(100)

            Log.d("select","get the nest byte dance data success")
            listner.onResult("nest_" + 600.00)
        }
}


viewModelScope.launch {
    
    
  
  var hasResult : Boolean = false 

	val listener : ResultListener = object : ResultListener {
    
    
    	override 	fun onResult(info String){
    
    
        	if(!hasResult) {
    
    
            hasResult = true 
            //deal with the result
          }
      }
  }
  
  requestNestGoldDataWithListener(listener)
  requestByteDanceGoldDataWithListener(listener
}

El pseudocódigo ya está disponible y se puede ver que el proceso aún es muy sencillo. En este momento, selectes posible que no pueda ver la diferencia entre usar devoluciones de llamada y Simple y potente.

Supongo que te gusta

Origin blog.csdn.net/u013762572/article/details/132968458
Recomendado
Clasificación