Оптимизация с помощью сопрограммы

#kotlin #kotlin-coroutines #coroutine

#kotlin #kotlin-сопрограммы #сопрограмма

Вопрос:

У меня есть простой код в Kotlin, который составил список запросов (150) с помощью библиотеки okhttp, и для каждого я анализирую результат html с помощью JSOUp.

Я использую сопрограмму, но я не понимаю, время с сопрограммой или без нее одинаковое (23 секунды)

Может быть, я сделал что-то плохое? Или http-запрос ограничен?

Мой код :

 fun parse(list: ArrayList<ChampionBean>) {

    runBlocking {
        list.forEach {
            launch {
                   val response = requestWithOkhttp(it.url)
                   val doc = Jsoup.parse(response.body?.string())
                   response.close()
                   parsedocwithJsoup(doc, it)                 
            }
        }
    }
}
  

Комментарии:

1. Пара вещей. Имеющаяся у вас сопрограмма унаследует контекст, поэтому у вас может быть контекст, содержащий только 1 поток. Вы можете распечатать println("I'm working in thread ${Thread.currentThread().name}") , чтобы найти имя потока. Также как настроен okhttpclient? Поскольку он может быть настроен на использование только одного http-соединения.

2. Спасибо за ваш ответ @Augusto, весь мой запуск был в одном потоке. Я решаю свою проблему с помощью запуска (диспетчеры. По умолчанию)

3. @Tenfour04 это скрипт, цель которого — дождаться выполнения всего запроса. Основная функция блокировки запуска заключается в том, чтобы дождаться всего запуска / асинхронности внутри

Ответ №1:

Я просто добавляю диспетчеров.По умолчанию и это работает. 7 секунд вместо 23. Я не знаю почему, диспетчер по умолчанию не был диспетчером по умолчанию. Код был запущен в основном методе в Intellij, без пользовательского интерфейса

  fun parse(list: ArrayList<ChampionBean>) {
    
        runBlocking {
            list.forEach {
                launch(Dispatchers.Default) {
                       val response = requestWithOkhttp(it.url)
                       val doc = Jsoup.parse(response.body?.string())
                       response.close()
                       parsedocwithJsoup(doc, it)                 
                }
            }
        }
    } 
  

Комментарии:

1. И с диспетчерами. Ввод-вывод слишком большого количества запросов одновременно, поэтому сервер перестает отвечать