Мумитроль
Тут идея в том, что когда ваш поток спит, он на самом деле блокирует занятые ресурсы
Глеб
если задач так и не было - он умирает и при новой таске поднимется инстанс нового потока с таким же таймаутом спячки
Мумитроль
Представьте что каждый раз когда в коде нужно было бы сделать sleep вы бы кидали весь оставшийся кол в executor с задержкой
Мумитроль
И ваш код выглядел бы ну неимоверно ужасно
Мумитроль
А теперь представьте что вам нужно ещё и циклично что-то выполнять с задержками между итерациями? Чтобы не блокировать ресурсы потока через sleep вам нужно будет как я уже писал выше каждый раз прокидывать все как новую таску в ваш экзекьютор
Мумитроль
И вот тут у вас уже кромешный ад будет
Мумитроль
Корутины позволяют вот такие вот таски на экзекьютор (грубо говоря) прокидывать неявно
Мумитроль
Но по факту там тот же экзекьютор под капотом
Kirill
То есть поток все равно будет усыпляться при запросе в веб а не использоваться другой коррутиной?
Мумитроль
Карутины не делают магии и вы сами можете писать без них на столько же производительный код, вот только вы такой не напишите и точно писать не будете. Все что вы написали красиво на Java, точно не эквивалент корутинам
Мумитроль
Именно)
Kirill
Обида(
Мумитроль
Нет
Мумитроль
Вы сейчас не в том направлении их рассматриваете
Мумитроль
Напишите мне код, без sleep, которые печатает некоторую строку в консоль с задержкой
Мумитроль
Допустим рандомной, получаемой на момент каждой итерации для следующей
Мумитроль
Допустим секунда
Kirill
А если сравнить с гошными коррутинами? Которыми все так восхищаются
Глеб
Допустим секунда
Unsafe.park(1000, false) 😂
Глеб
всё
Глеб
Допустим рандомной, получаемой на момент каждой итерации для следующей
Я понял... так на этот случай есть delay publish в экзекюторы и в java и в тот же android Handler
Мумитроль
Я понял... так на этот случай есть delay publish в экзекюторы и в java и в тот же android Handler
Внутри контекста для работы на UI потоке в ведре и так Handler используется
Мумитроль
Давайте так, с самого начала. Лучше разобраться сперва в чем же сама магия корутин в котлине
Мумитроль
И для этого будем проводить аналогию с Executors в православной Java
Kirill
Прятать коллбэк хэл?
Глеб
Давайте так, с самого начала. Лучше разобраться сперва в чем же сама магия корутин в котлине
ну... авторы утверждают - в линейности написания, но асихронности исполнения и "несоздаванию потоков"
Мумитроль
Предположим, что у вас есть пул потоков, допустим на N. Вы запускаете N задач, где выполняете тривиальную логику, вам нужно кажду секунду печатать страку каждой задачей.
Глеб
Я о предметном использовании, а не в красивых фразах
Понял ...Не говорят... либо очень очень мало - не ясно
Мумитроль
Предположим, что у вас есть пул потоков, допустим на N. Вы запускаете N задач, где выполняете тривиальную логику, вам нужно кажду секунду печатать страку каждой задачей.
А теперь представим, что наши задачи в силу того что их пишит джун, написаны как простой цикл в котором мы делаем TimeUnit.SECONDS.sleep(1); sout("Hello"); (тело Runnable)
Глеб
пока понятно
Мумитроль
Мы понимаем, что пул на N и задач у нас N. Что же будет когда все задачи сделали sleep() и мы попробуем добавить N+1 задачу в пул?
Мумитроль
Начнет ли она выполнятся?
Мумитроль
Нет. А даже если и не все сделали sleep, не начнет
Мумитроль
Потому как все N потоков внутри пула заняты своими задачами
Глеб
если не превышен maxThrCount - то поднимется еще тред, иначе - ожидание в queue
Мумитроль
У нас тут к примеру мобилка, в которой кол-во потоков очень просаживает производительность
Глеб
Стоп, мы ничего не поднимаем.
ок.... да ... все остальные будут ждать - эти n лупов
Мумитроль
Так вот, если эти циклы у нас еще и без условия остановки, то пул по факту мертв
Мумитроль
Я прав?
Глеб
да
Мумитроль
НО, у нас есть проблема (и тут уже начнется магия, которая призвана это решить)
Глеб
и? заинтриговал прям
Мумитроль
Ведь потоки нашего пула после каждого принта начинают простаивать 1 секунду, что для любого проца вечность по факту. И как вот такое исправить?
Kirill
Мы пильнем коррутины вместо потоков, которые это решат?
Мумитроль
Если мы в контексте нашей православной Java, то нам будет необходимо переписать код наших тасков так, что бы избавится от цикла с использованием submit with daley
Глеб
Ведь потоки нашего пула после каждого принта начинают простаивать 1 секунду, что для любого проца вечность по факту. И как вот такое исправить?
Ну во первых понимая это - отказаться от сплит подхода.... в пользу чего.....пока не знаю...надо думать
Мумитроль
Т.е. мы сделаем, так что каждая итерация будет запускать следующую итерацию по средствам запуска отложеной таски
Kirill
Заменим😁
Мумитроль
Так вот, и тут я вам вот что скажу. Если вы напишите первоначальный пример на карутинах, то вы сможете поддержитвать N + (миллион тасков) не меняя свой код никак
Мумитроль
Кстати, можем в лс, если вдруг я тут спамлю сильно(
Kirill
Я например тоже слежу за дискуссией)
Глеб
Кстати, можем в лс, если вдруг я тут спамлю сильно(
Я думаю познавательно всем будет... и джавам и котлинам (мы ж не "о тёлках трепимся")
Aleksey Goryachev
Кстати, можем в лс, если вдруг я тут спамлю сильно(
Перестань https://ru.wikipedia.org/wiki/Мораль_господ_и_мораль_рабов
Kirill
Коррутины против фьючерсов и тредпулов
Мумитроль
Смотри...ты говоришь "не меняя код" - давай зафиксируем этот тезис - "Слипы - остаются!!!"
Этот код семантически будет тем же, но должен быть написан в контексте корутин (поправочка)
Глеб
Этот код семантически будет тем же, но должен быть написан в контексте корутин (поправочка)
А вот этот стрим терминов - давайте расшифровывать на простой колхозный
Мумитроль
TimeUnit.SECONDS.sleep(long) -> delay(int)
Мумитроль
ну и корутин билдер вместо Runnable
Мумитроль
все)
Kirill
TimeUnit.SECONDS.sleep(long) -> delay(int)
Delay - слип на слип реализованный через саспенд?
Глеб
все)
сек.... вникаю
Мумитроль
+ к этому всему, как вы останавливаете таски скормленные в пул?
Мумитроль
Корутины прерываемые)
Мумитроль
Причем вот я хочу уметь убивать таски, но оставлять пул живым. В контексте корутин, это все в коробке
Kirill
Что значит прерываемые если они не могут поток другой коррутине отдать?)