Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

143
Visualizações
¿Es seguro usar un estado mutable no sincronizado con Kotlin Flow?

¿Es seguro seguir el código y por qué?

 val flow: Flow<String> = ... val allStrings = mutableListOf<String>() var sum = 0 flow.transform { allStrings += it emit(it.toInt()) }.collect { sum += it }

La siguiente prueba demuestra que se llama al cuerpo de collect {} desde diferentes subprocesos:

 val ctx = newFixedThreadPoolContext(32, "my-context") runBlocking(ctx) { val f = flow<Int> { (1 .. 1000).forEach { emit(it) } } var t: Thread? = null f.collect { delay(1) // this requirement will fail if (t == null) t = Thread.currentThread() else require(t == Thread.currentThread()) } }

Y otro que pone a prueba la publicación:

 fun main(args: Array<String>) { val ctx = newFixedThreadPoolContext(32, "my-context") runBlocking(ctx) { val f = flow<Int> { (1 .. 1000000).forEach { emit(it) } } var c = 0 f.transform { c += 1 boo() c += 1 emit(it) c += 1 }.collect { c += 1 boo() c += 1 } println(c) // prints 5_000_000 } } suspend fun boo() { withContext(Dispatchers.IO) { } }

Por lo tanto, parece que el flujo de kotlin garantiza la publicación entre invocaciones de rutina, pero ¿es este un efecto secundario intencional (o incluso documentado) o de implementación?

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Sí, el código es seguro. Los flujos son secuenciales por defecto.

Cada colección individual de un flujo se realiza secuencialmente a menos que se utilicen operadores especiales que operan en múltiples flujos. El cobro funciona directamente en la corrutina que llama a un operador de terminal ( collect ). No se lanzan nuevas rutinas por defecto. Cada valor emitido es procesado por todos los operadores intermedios desde aguas arriba hasta aguas abajo y luego se entrega al operador terminal después.

Los flujos de Kotlin se basan en funciones de suspensión y son completamente secuenciales, pero no de un solo subproceso.

Por lo tanto, parece que el flujo de kotlin garantiza la publicación entre invocaciones de rutina, pero ¿es este un efecto secundario intencional (o incluso documentado) o de implementación?

Aquí dice :

un flujo es un tipo que puede emitir múltiples valores secuencialmente

De acuerdo con esto, entiendo que no se recopilará ningún valor nuevo hasta que se procese el valor anterior, sin importar cuántos subprocesos estén involucrados.

Como menciona Roman en su comentario, aquí hay un buen artículo sobre la ejecución secuencial . Una gran cita de allí:

Aunque una corrutina en Kotlin puede ejecutarse en varios subprocesos, es como un subproceso desde el punto de vista del estado mutable. Dos acciones en la misma rutina no pueden ser concurrentes. Y al igual que con los subprocesos, debe evitar compartir su estado mutable entre rutinas o tendrá que preocuparse por la sincronización. Evite compartir el estado mutable. Limite cada objeto mutable a un solo hilo o a una sola rutina y duerma bien.

Y esto es aplicable a los Flows , porque la recopilación de Flow funciona directamente en la corrutina que llama a un operador de terminal. No se lanzan nuevas rutinas por defecto.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda