Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

449
Views
Kotlin Coroutines: una sola corrutina a la vez en un solo hilo

Considere este código a continuación, estoy tratando de usar Executors.newFixedThreadPool(1).asCoroutineDispatcher() para crear un despachador de hilo único; Quiero que el código dentro de launch(singleThread){...} se ejecute secuencialmente

el resultado esperado debería ser como el siguiente porque async-block#2 alcanza/adquiere singleThread primero

bloque asíncrono #2
bloque asíncrono #1
bloque de un solo hilo #2
bloque de un solo hilo #1
la respuesta es 3

pero el resultado real es

bloque asíncrono #2
bloque asíncrono #1
bloque de un solo hilo #1
bloque de un solo hilo #2
la respuesta es 3

single-thread-block-#2 y single-thread-block-#1 parecen ejecutarse en paralelo, singleThread no hace ninguna diferencia aquí

 import java.util.concurrent.Executors import kotlinx.coroutines.* import kotlin.system.* val singleThread = Executors.newFixedThreadPool(1).asCoroutineDispatcher() fun main() = runBlocking<Unit> { val time = measureTimeMillis { val one = async { // async block #1 delay(200) println("async block #1") launch (singleThread) { delay(500) println("single thread block #1") } 2 } val two = async { // async block #2 delay(100) println("async block #2") launch (singleThread) { delay(1500) println("single thread block #2") } 1 } println("The answer is ${one.await() + two.await()}") } println("Completed in $time ms") }

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Tenga en cuenta que el delay() es la función de suspend en el código. Se implementa a través de la suspensión coroutine. Significa que la ejecución del código se suspende en el momento en que solicita el delay y solo se reanuda después del tiempo de espera. El subproceso (por ejemplo, uno que usa a través de async(singleThread) {..} no está ocupado esperando que transcurra el tiempo.

El escenario general se ve así

  • ...
  • el "bloque asíncrono #2" impreso
  • la tarea 2 se está ejecutando en singleThread
  • la tarea 2 se suspende con delay(1500) , el singleThread es gratis
  • la tarea 1 se inicia en el singleThread
  • la tarea 1 se suspende con delay(500) , el singleThread es gratis
  • en ese punto tenemos la cola de retraso:
    • reanudar el delay(500) para la tarea 1
    • reanudar el delay(1500) para la tarea 2
  • después de algún tiempo
  • resume(500) programa la segunda parte de la tarea 1 para que se ejecute en singleThread
  • después de algún tiempo
  • resume(1500) programa la segunda parte de la tarea 2 para que se ejecute en singleThread
over 4 years ago · Santiago Trujillo Report

0

Además de la respuesta de @EugenePetrenko, hay un nuevo método CoroutineDispatcher.limitedParallelism(numberOfParallelism) , que puede usar para garantizar la restricción de paralelismo: se puede ejecutar como máximo 1 coroutine simultáneamente en este despachador. Se verá como:

 val singleThread = Dispatchers.IO.limitedParallelism(1) someCoroutineScope.launch (singleThread) { ... }

La función limitedParallelism está disponible a partir de la versión 1.6.0 de la biblioteca kotlinx.coroutines .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!