одновременно, но, кажется, что-то пошло не так.
urls - просто массив из 10 url'ов на разные страницы Википедии.
Код такой:
fun main() = runBlocking {
println("Пробуем Channel'ы")
var date = Date().time
val tryCahannel = Channel<String>()
launch {
println("Какое-то действие")
val ktd = Date().time
for (i in urls) tryCahannel.send(i)
println("Время какого-то действия ${Date().time - ktd}ms")
}
println("Удивительно, но этот код выполнился")
repeat(urls.size) {
val resp = client.get<String>(tryCahannel.receive())
println(if (resp.contains("<!DOCTYPE html>")) "HTML-страничка пошла!" else "Это не HTML-страничка")
}
println("Общее время: ${Date().time - date}ms")
println("Вот и Channel'ам конец\n\n")
println("А теперь простая последовательная отправка запросов")
date = Date().time
commonRequests()
println("Общее время: ${Date().time - date}ms")
}
Результат дает такой:
Пробуем Channel'ы
Удивительно, но этот код выполнился
Какое-то действие
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
Время какого-то действия 5826ms
HTML-страничка пошла!
Общее время: 7344ms
Вот и Channel'ам конец
А теперь простая последовательная отправка запросов
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
HTML-страничка пошла!
Общее время: 7264ms
Process finished with exit code 0
Собственно, не могу понять почему время исполнения увеличилось. Ради его сокращение все и писалось.
Это я что-то сделал не так и запустил запросы все же последовательно? Или в принципе такое взаимодействие не может быть быстрее?
Тут одна корутина - launch. А вам нужно просто загрузить страницу ? val scope = ... urls.map { url -> scope.async { load(url) }.awaitAll()
Обсуждают сегодня