#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. И с диспетчерами. Ввод-вывод слишком большого количества запросов одновременно, поэтому сервер перестает отвечать