Re[29]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 13:52
Оценка:
Здравствуйте, ·, Вы писали:

·>Здравствуйте, Serginio1, Вы писали:


M>>>И по аналогичной схеме можно сделать всё, что написано по твоей ссылке.

S>>Ну и в итоге зачем зоопарк городить?
·>В том, что ты не понял какие задачи решает сабж.
·>Перечитай топик, внимательно.

Читаю

Можно писать простой код и запускать его на миллионе тредов. Никакой колбасы async, корутин и других CPS ужасов. Обычный плоский код.
Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.

Зачем если уже есть Task c ContinueWith и async/await которые решает больший круг задач чем IO.
Зачем нужен зоопарк с виртуальными потоками?
и солнце б утром не вставало, когда бы не было меня
Re[27]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 13:55
Оценка:
Здравствуйте, ·, Вы писали:

S>>https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#whenallorfirstexception

·>А думаешь откуда это появилось в дотнете? Они же слизали CompletableFuture, которое было доступно ещё лет ~10 назад, хреново как-то слизали, код — жуть. Вот более вменяемый аналог:
·>
·><T> CompletableFuture<List<T>> WhenAllOrFirstException(CompletableFuture<T>... tasks) 
·>{
·>    var all = CompletableFuture.allOf(tasks);
·>    Stream.of(tasks).forEach(t -> t.exceptionally(ex -> 
·>    {
·>        all.completeExceptionally(ex);
·>        return null;
·>    }));
·>    return all.thenApply(x -> Stream.of(tasks).map(f -> f.join()).toList());
·>}
·>

И где здесь виртуальные потоки?
и солнце б утром не вставало, когда бы не было меня
Re[30]: Киллер фича JDK 21 - virtual threads
От: rudzuk  
Дата: 11.05.23 13:59
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Зачем если уже есть Task c ContinueWith и async/await которые решает больший круг задач чем IO.

S> Зачем нужен зоопарк с виртуальными потоками?

avalon/3.0.2
Re[30]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.05.23 14:12
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Зачем если уже есть Task c ContinueWith и async/await которые решает больший круг задач чем IO.

S>Зачем нужен зоопарк с виртуальными потоками?

А кто сказал что виртуальные потоки можно использовать только для io ?
Re[31]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 14:13
Оценка: -1
Здравствуйте, Pauel, Вы писали:

S>> Зачем если уже есть Task c ContinueWith и async/await которые решает больший круг задач чем IO.

S>>Зачем нужен зоопарк с виртуальными потоками?

P>А кто сказал что виртуальные потоки можно использовать только для io ?

Автор топика. Надо читать всю ветку.
Смысл в CancellationToken, работа с задачей, а не результатом задачи использование TaskCompletionSource
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.05.2023 14:17 Serginio1 . Предыдущая версия . Еще …
Отредактировано 11.05.2023 14:14 Serginio1 . Предыдущая версия .
Re[32]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 11.05.23 14:16
Оценка:
Здравствуйте, Serginio1, Вы писали:

P>>А кто сказал что виртуальные потоки можно использовать только для io ?

S>Автор топика. Надо читать всю ветку

Все, что делается через Task в дотнете, можно делать через виртуальные треды. Только код будет выглядеть иначе.

IO в данном случае уже поддерживается рантаймом, перешедуливание будет работать само. А вот всё остальное нужно разумеется вставлять связку самостоятельно, ровно так же, как вы это делаете через ContinueWith итд.
Отредактировано 11.05.2023 14:18 Pauel . Предыдущая версия .
Re[33]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 14:42
Оценка:
Здравствуйте, Pauel, Вы писали:

P>Здравствуйте, Serginio1, Вы писали:


P>>>А кто сказал что виртуальные потоки можно использовать только для io ?

S>>Автор топика. Надо читать всю ветку

P>Все, что делается через Task в дотнете, можно делать через виртуальные треды. Только код будет выглядеть иначе.


P>IO в данном случае уже поддерживается рантаймом, перешедуливание будет работать само. А вот всё остальное нужно разумеется вставлять связку самостоятельно, ровно так же, как вы это делаете через ContinueWith итд.


Ну и какой смысл в ограниченном IO? Если все равно приходится использовать таски с CancellationToken или граф тасков. Виртуальные потоки это для старого кода.
В новом коде как правило все уже асинхронно и нет смысла устраивать зоопарк!
и солнце б утром не вставало, когда бы не было меня
Re[28]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 15:46
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Здравствуйте, ·, Вы писали:

>>>А думаешь откуда это появилось в дотнете? Они же слизали CompletableFuture, которое было доступно ещё лет ~10 назад, хреново как-то слизали, код — жуть. Вот более вменяемый аналог:
S>Ну задачи появились еще в .NET Framework 4.0 была выпущена 12 апреля 2010 года
Task (2010 год) это аналог Future (2004 год). А там в коде TaskCompletionSource (2020 год) который реализует удобную функциональность которая есть в CompletableFuture (2014 год).

S>И главная фича acync/await была продолжение yield для создания автомата

S> Понятно, что Таски это не дотнетовское изобретение. Но и отнюдь не явовское
Возможно. Даже если и так, просто видно дотнет отстаёт на ~5 лет. Вангую, что лет через пять ты создашь топик "Киллер фича c# — виртуальные треды", хотя не уверен, что осилят.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[30]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 15:53
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>Читаю

S>

S>Можно писать простой код и запускать его на миллионе тредов. Никакой колбасы async, корутин и других CPS ужасов. Обычный плоский код.
S>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.

S> Зачем если уже есть Task c ContinueWith и async/await которые решает больший круг задач чем IO.
S>Зачем нужен зоопарк с виртуальными потоками?
Чтобы можно было писать простой код и запускать его на миллионе тредов. Никакой колбасы async, корутин и других CPS ужасов. Обычный плоский код.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[28]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 15:55
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S>·>А думаешь откуда это появилось в дотнете? Они же слизали CompletableFuture, которое было доступно ещё лет ~10 назад, хреново как-то слизали, код — жуть. Вот более вменяемый аналог:

S> И где здесь виртуальные потоки?
Я ответил в том сообщении, но ты не удосужился прочитать или даже просто отквотить: "Это никакого отношения к сабжу не имеет. Но в качестве ликбеза:"
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[29]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 16:10
Оценка:
Здравствуйте, ·, Вы писали:

S>>Здравствуйте, ·, Вы писали:

>>>>А думаешь откуда это появилось в дотнете? Они же слизали CompletableFuture, которое было доступно ещё лет ~10 назад, хреново как-то слизали, код — жуть. Вот более вменяемый аналог:
S>>Ну задачи появились еще в .NET Framework 4.0 была выпущена 12 апреля 2010 года
·>Task (2010 год) это аналог Future (2004 год). А там в коде TaskCompletionSource (2020 год) который реализует удобную функциональность которая есть в CompletableFuture (2014 год).
TaskCompletionSource вместе с тасками

S>>И главная фича acync/await была продолжение yield для создания автомата

S>> Понятно, что Таски это не дотнетовское изобретение. Но и отнюдь не явовское
·>Возможно. Даже если и так, просто видно дотнет отстаёт на ~5 лет. Вангую, что лет через пять ты создашь топик "Киллер фича c# — виртуальные треды", хотя не уверен, что осилят.
Смысла тасков без TaskCompletionSource нет в .Net она появилась вместе с тасками в 2010 а в Яве в 2014. Кто опаздывает?
Ну и не создам точно ибо мне async/await ну никак не напрягает. Наоборот код более понятен.
Но я рад за вас, что вы так довольны этой фичей
и солнце б утром не вставало, когда бы не было меня
Re[31]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 16:13
Оценка:
Здравствуйте, ·, Вы писали:

S>> Зачем если уже есть Task c ContinueWith и async/await которые решает больший круг задач чем IO.

S>>Зачем нужен зоопарк с виртуальными потоками?
·>Чтобы можно было писать простой код и запускать его на миллионе тредов. Никакой колбасы async, корутин и других CPS ужасов. Обычный плоский код.
Еще раз для упертых. виртуальные потоки это одна сотая от всех Тасков. Там в первую очередь TaskCompletionSource, а не IO причем внутри они могут вызывать друг друга.
и солнце б утром не вставало, когда бы не было меня
Re[34]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 16:26
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

S> Ну и какой смысл в ограниченном IO? Если все равно приходится использовать таски с CancellationToken или граф тасков. Виртуальные потоки это для старого кода.

S> В новом коде как правило все уже асинхронно и нет смысла устраивать зоопарк!
Графы тасков требуется создавать только в маленькой части кода, где требуется разворачивать и сворачивать параллельное исполнение крупных блоков (а мелочь параллелить смысла вообще нет). Это будет внутри одного метода.
Весь остальной код проще писать (и понимать, и тестировать, и отлаживать) последовательно и линейно.
task/async же требует засорения всего кода. Прогонять это всё через много слоёв стека. Требовать дублирования для каждого метода его синхронной и асинхронной реализации.

Я понимаю, может быть ты старательный и трудолюбивый, любишь копипасту, две строчки кода считаешь не серьёзным. Но я лентяй и раздолбай — мне бы вкинуть пару строчек кода и забыть.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[35]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 16:31
Оценка:
Здравствуйте, ·, Вы писали:


·>task/async же требует засорения всего кода. Прогонять это всё через много слоёв стека. Требовать дублирования для каждого метода его синхронной и асинхронной реализации.

Уже давно нет синхронной реализации. Вернее можно получить через Result или task.GetAwaiter().GetResult()
·>Я понимаю, может быть ты старательный и трудолюбивый, любишь копипасту, две строчки кода считаешь не серьёзным. Но я лентяй и раздолбай — мне бы вкинуть пару строчек кода и забыть.

Копипасту все любят. Только и интеллисенсе и ИИ в VS это не проблема
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.05.2023 17:12 Serginio1 . Предыдущая версия .
Re[3]: Киллер фича JDK 21 - virtual threads
От: mrTwister Россия  
Дата: 11.05.23 17:10
Оценка:
Здравствуйте, ·, Вы писали:


·>Нет, такого добра уже везде как грязи. Горутины это специальная модель асинхронного взаимодействия — где у тебя есть специально помеченный в ЯП кусок кода и определённый механизм взаимодействия — каналы и посылка сообщений, тоже со своими ключевыми словами в ЯП и специальным магическим синтаксисом. И оно никак не стыкуется с классическими механизмами типа локов, хотя они тоже есть в go.


Откуда ты это взял? В go вытесняющая многозадачность, переключение горутины происходит даже если она крутит пустой цикл.
лэт ми спик фром май харт
Re[9]: Киллер фича JDK 21 - virtual threads
От: Аноним  
Дата: 11.05.23 17:12
Оценка:
·>А зачем он везде в общем случае? Специальная конструкция как в CancellationToken не требуется.

M>>Если реализовать cancellation (как я понимаю, применительно к IO в Java это делается через AsynchronousChannel), то будут Future (вместо Task). И в итоге можно получить тот же function coloring

·>Если у тебя есть какой-то сокет и ты хочешь прервать код, который на нём ждёт слишком долго, то поставь таймаут. Или если какое-то внешнее взаимодейсвтие, что сокет больше не нужен — закрой сокет. И т.п.
·>Т.е. какой-то универсальный cancellation не нужен.

Таймаут выбирается исходя из условий задачи (удаленность сервера в сети и т.п.).
Закрытие сокета не всегда годится. Что если мне нужно прервать конкретную IO операцио, а потом продолжить работу с сокетом.
Это все плохие решения, к которым приходится прибегать, если API не оставляет других вариантов.

non-blocking I/O можно прервать через Thread.interrupt, но у этого флага весьма специфическое поведение: clearance.
Как учесть это в стороннем коде, мне не ясно.
  См. https://stackoverflow.com/a/37207163

Here's a SUPER FUN EXAMPLE:

ch.qos.logback.core.AsyncAppenderBase prior to version 1.1.4 catches and swallows InterruptedException without
resetting the flag on the thread.

So, if you use anything which routes to this logger (like slf4j), it will silently eat your thread interrupt
status. 'Cos, I mean, who doesn't check thread interrupt status before and after every possible log operation?


Из чего я делаю вывод, что cancellation для IO/CPU-bound задач нужно реализовать иным способ — добавлять перегруженные методы c аналогом CancellationToken, либо использовать Future.

При работе с IO/CPU-bound кодом надежный cancellation для меня даже более критичен, чем потенциальный расход ресурсов на тяжеловесные потоки.
Поэтому я не согласен с аргументом о том, что virtual threads позволят избежать необходимости перегрузки (или реализации через Future) существущих синхронных методов типа readAllBytes.

P.S. nickname у сообщения почему-то поменялся на Аноним Правильный nick — m2user
Отредактировано 11.05.2023 18:05 m2user . Предыдущая версия .
Re[14]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 11.05.23 17:49
Оценка: 10 (1)
S>>>·>И компилятор тут непричём. Это просто детали реализации socket api.
S>>> То есть это касается только сокетов?
S>·>Весь io.
S>Ну это понятно. Просто Tаsk это не только IO.

На всякий случай приведу полный список модифицированного:
https://openjdk.org/jeps/444

Detailed changes

The remaining subsections describe, in detail, the changes we propose across the Java Platform and its implementation:

java.lang.Thread
Thread-local variables
java.util.concurrent
Networking
java.io
Java Native Interface (JNI)
Debugging (JVM TI, JDWP, and JDI)
JDK Flight Recorder (JFR)
Java Management Extensions (JMX)


Т.е. не только IO, например Lock тоже поддерживаются (кроме synchronized block).
Re[32]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 18:14
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> ·>Чтобы можно было писать простой код и запускать его на миллионе тредов. Никакой колбасы async, корутин и других CPS ужасов. Обычный плоский код.

S> Еще раз для упертых. виртуальные потоки это одна сотая от всех Тасков. Там в первую очередь TaskCompletionSource, а не IO причем внутри они могут вызывать друг друга.
Отлично, ты наконец-то стал что-то подозревать. Таски это аналог Future, который в java уже очень давно. Сабж — про другое.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[36]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 18:14
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> ·>task/async же требует засорения всего кода. Прогонять это всё через много слоёв стека. Требовать дублирования для каждого метода его синхронной и асинхронной реализации.

S> Уже давно нет синхронной реализации. Вернее можно получить через Result или task.GetAwaiter().GetResult()
Где нет?

S> ·>Я понимаю, может быть ты старательный и трудолюбивый, любишь копипасту, две строчки кода считаешь не серьёзным. Но я лентяй и раздолбай — мне бы вкинуть пару строчек кода и забыть.

S> Копипасту все любят. Только и интеллисенсе и ИИ в VS это не проблема
Не говори за всех.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 18:27
Оценка:
Здравствуйте, mrTwister, Вы писали:

T> Откуда ты это взял? В go вытесняющая многозадачность, переключение горутины происходит даже если она крутит пустой цикл.

Не знал. Изначально там не было. Потом добавили оказывается.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.