Мумитроль
Тут идея в том, что когда ваш поток спит, он на самом деле блокирует занятые ресурсы
Глеб
если задач так и не было - он умирает и при новой таске поднимется инстанс нового потока с таким же таймаутом спячки
Мумитроль
Представьте что каждый раз когда в коде нужно было бы сделать sleep вы бы кидали весь оставшийся кол в executor с задержкой
Мумитроль
И ваш код выглядел бы ну неимоверно ужасно
Мумитроль
А теперь представьте что вам нужно ещё и циклично что-то выполнять с задержками между итерациями? Чтобы не блокировать ресурсы потока через sleep вам нужно будет как я уже писал выше каждый раз прокидывать все как новую таску в ваш экзекьютор
Мумитроль
И вот тут у вас уже кромешный ад будет
Мумитроль
Корутины позволяют вот такие вот таски на экзекьютор (грубо говоря) прокидывать неявно
Мумитроль
Но по факту там тот же экзекьютор под капотом
Kirill
То есть поток все равно будет усыпляться при запросе в веб а не использоваться другой коррутиной?
Мумитроль
Карутины не делают магии и вы сами можете писать без них на столько же производительный код, вот только вы такой не напишите и точно писать не будете. Все что вы написали красиво на Java, точно не эквивалент корутинам
Мумитроль
Мумитроль
Именно)
Kirill
Обида(
Глеб
Мумитроль
Нет
Мумитроль
Вы сейчас не в том направлении их рассматриваете
Kirill
Мумитроль
Напишите мне код, без sleep, которые печатает некоторую строку в консоль с задержкой
Мумитроль
Допустим рандомной, получаемой на момент каждой итерации для следующей
Глеб
Мумитроль
Допустим секунда
Kirill
А если сравнить с гошными коррутинами? Которыми все так восхищаются
Мумитроль
Мумитроль
Kirill
Глеб
всё
Глеб
Мумитроль
Мумитроль
Давайте так, с самого начала. Лучше разобраться сперва в чем же сама магия корутин в котлине
Мумитроль
И для этого будем проводить аналогию с Executors в православной Java
Kirill
Прятать коллбэк хэл?
Мумитроль
Предположим, что у вас есть пул потоков, допустим на N. Вы запускаете N задач, где выполняете тривиальную логику, вам нужно кажду секунду печатать страку каждой задачей.
Мумитроль
Глеб
Глеб
пока понятно
Мумитроль
Мы понимаем, что пул на N и задач у нас N. Что же будет когда все задачи сделали sleep() и мы попробуем добавить N+1 задачу в пул?
Мумитроль
Начнет ли она выполнятся?
Мумитроль
Нет. А даже если и не все сделали sleep, не начнет
Мумитроль
Потому как все N потоков внутри пула заняты своими задачами
Глеб
если не превышен maxThrCount - то поднимется еще тред, иначе - ожидание в queue
Мумитроль
Мумитроль
У нас тут к примеру мобилка, в которой кол-во потоков очень просаживает производительность
Мумитроль
Так вот, если эти циклы у нас еще и без условия остановки, то пул по факту мертв
Мумитроль
Я прав?
Глеб
да
Мумитроль
НО, у нас есть проблема (и тут уже начнется магия, которая призвана это решить)
Глеб
и? заинтриговал прям
Мумитроль
Ведь потоки нашего пула после каждого принта начинают простаивать 1 секунду, что для любого проца вечность по факту. И как вот такое исправить?
Kirill
Мы пильнем коррутины вместо потоков, которые это решат?
Мумитроль
Если мы в контексте нашей православной Java, то нам будет необходимо переписать код наших тасков так, что бы избавится от цикла с использованием submit with daley
Глеб
Мумитроль
Т.е. мы сделаем, так что каждая итерация будет запускать следующую итерацию по средствам запуска отложеной таски
Kirill
Заменим😁
Мумитроль
Так вот, и тут я вам вот что скажу. Если вы напишите первоначальный пример на карутинах, то вы сможете поддержитвать N + (миллион тасков) не меняя свой код никак
Глеб
Мумитроль
Кстати, можем в лс, если вдруг я тут спамлю сильно(
Kirill
Я например тоже слежу за дискуссией)
Kirill
Kirill
Коррутины против фьючерсов и тредпулов
Глеб
Kirill
Мумитроль
Глеб
Мумитроль
TimeUnit.SECONDS.sleep(long) -> delay(int)
Мумитроль
ну и корутин билдер вместо Runnable
Мумитроль
все)
Глеб
Мумитроль
+ к этому всему, как вы останавливаете таски скормленные в пул?
Мумитроль
Корутины прерываемые)
Мумитроль
Причем вот я хочу уметь убивать таски, но оставлять пул живым. В контексте корутин, это все в коробке
Kirill
Что значит прерываемые если они не могут поток другой коррутине отдать?)