CoRoutine Asyn c не работает параллельно - PullRequest
0 голосов
/ 20 июня 2020

У меня есть следующий код, который я пытаюсь запустить для параллельного запуска сопрограмм. Однако код не работает параллельно. Для возврата всех цен на акции требуется 30 секунд вместо 10 секунд. Однако, если я использую GlobalScope.launch, он работает правильно. Из документации я понял, что нам следует избегать использования GlobalScope и использовать область сопрограмм. Можете ли вы помочь понять, почему это не работает параллельно?

import kotlinx.coroutines.*

suspend fun getStockPrice(company: String) : Int{
    println("Fetching Stock Price")
    Thread.sleep(10000)
    return 100
}



fun CoroutineScope.launchCoRoutines() {
    val companies = listOf<String>("Google", "Amazon", "Microsoft")

    launch {

        var startTime = System.currentTimeMillis()
        val sharePrice = mutableListOf<Deferred<Int>>()
        for (company in companies) {
            sharePrice += async {
                getStockPrice(company).toInt()
            }
        }

        for (share in sharePrice) {
            println(share.await())
        }
        var endTime = System.currentTimeMillis()

        println(endTime - startTime)

    }


}

 fun main()  {
     runBlocking{
         launchCoRoutines()
     }
     println("Request Sent")
    Thread.sleep(55000)
}

1 Ответ

1 голос
/ 20 июня 2020

Ответ можно найти здесь:

Kotlin: coroutineScope медленнее, чем GlobalScope

как сказано:

coroutineScope не определяет своего собственного диспетчера, поэтому вы наследуете его от вызывающего, в данном случае созданного с помощью runBlocking. Он использует единственный поток, на котором он вызван.

EDIT: вы можете использовать эту функцию

fun launchCoRoutines() {
    val companies = listOf<String>("Google", "Amazon", "Microsoft")

    launch(Dispatchers.Default) { // will get dispatched to DefaultDispatcher 

        var startTime = System.currentTimeMillis()
        val sharePrice = mutableListOf<Deferred<Int>>()
        for (company in companies) {
            sharePrice += async {
                getStockPrice(company).toInt()
            }
        }

        for (share in sharePrice) {
            println(share.await())
        }
        var endTime = System.currentTimeMillis()

        println(endTime - startTime)
    }
}

EDIT 2: см. Комментарий @ Anime sh Sahu, это лучший ответ

...