Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 04.05.23 21:13
Оценка: 59 (6) :)
В сентябре обещают зарелизить JEP 444

Можно писать простой код и запускать его на миллионе тредов. Никакой колбасы async, корутин и других CPS ужасов. Обычный плоский код.
Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Киллер фича JDK 21 - virtual threads
От: σ  
Дата: 04.05.23 21:25
Оценка:
·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.
А вот в ирланге preemption есть
  Скрытый текст
вроде
Re: Киллер фича JDK 21 - virtual threads
От: reversecode google
Дата: 04.05.23 21:40
Оценка:
ну так тоже самое что и в го
только а эрлашланге еще и на каждом атоме перешедулинг вроде как есть
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 04.05.23 22:10
Оценка:
Здравствуйте, reversecode, Вы писали:

r> ну так тоже самое что и в го

В го это специальные языковые конструкции типа go, chan, прибито гвоздями. virtual threads это обычная многопоточка — хочешь локи, хочешь латчи, блокирующие очереди, и т.п.

r> только а эрлашланге еще и на каждом атоме перешедулинг вроде как есть

Там вообще эти жуткие акторы, иммутабельные сообщения только. Взять и и тупо расшарить данные между тредами — фигушки.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 04.05.23 23:25
Оценка:
Здравствуйте, σ, Вы писали:

σ> ·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.

σ> А вот в ирланге preemption есть
  Скрытый текст
вроде

Там с перформансом не всё радужно. И акторы... сомнительное удовольствие.
Виртуальные треды это про асинхронное выполнение простого синхронного кода, скорее.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Киллер фича JDK 21 - virtual threads
От: reversecode google
Дата: 05.05.23 07:32
Оценка: :)
не совсем понятно в техническом плане что там они такого сделали
если в эршланге вытесняющий атом то в яве сделали каждую инструкцию что ли
ну т.е. как в обычном cpu где ОС каждый поток может прервать в любой момент
времени разбираться нет
так что если будет инфа о технических подробностях, закидывайте сюда

рано или поздно народ конечно разберет все на кусочки в статьях и докладах
как го и его шедуллер который затянули и в котлин и в раст как минимум
ну и в эршланге он там почти такой же только сильно наговнокоден
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 05.05.23 08:34
Оценка:
Здравствуйте, reversecode, Вы писали:

r> не совсем понятно в техническом плане что там они такого сделали

Возможность подменять стеки на уровне рантайма. И собственно всё.

r> если в эршланге вытесняющий атом то в яве сделали каждую инструкцию что ли

r> ну т.е. как в обычном cpu где ОС каждый поток может прервать в любой момент
Виртуальные треды перешедулятся на реальные треды в момент всяких многопоточных действий, типа locks, yield, sleep и т.п. Если виртуальный тред будет внутри себя крутить вычислительный цикл, то он займёт реальный тред. Т.е. кооперативная многозадачность или асинк с человеческим лицом.

Когда в при исполнении кода виртуального треда происходил блокировка/етс — стек сохраняется в куче, и добавляется таск в шедулер на продолжение. Шедулер берёт очередной таск, восстанавливает стек и монтирует его на реальный тред. И так по кругу.
Сами стеки — это маленькие кусочки порядка сотни байт.

r> времени разбираться нет

r> так что если будет инфа о технических подробностях, закидывайте сюда
Собственно кроме свопа стека ничего магического нет. Это не магия компилятора, не изменение в языке, никаких новых ключевых слов или конструкций не появилось, а просто библиотечное расширение существующих API в JDK.

Есть ограничения, конечно, типа того, что нативный вызов требует реального треда (по очевидным причинам). Но такое, как я понимаю неизбежно и везде.

r> рано или поздно народ конечно разберет все на кусочки в статьях и докладах

Тут небольшая статья: https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/

r> как го и его шедуллер который затянули и в котлин и в раст как минимум

r> ну и в эршланге он там почти такой же только сильно наговнокоден
Нет никакого специального нового магического шедулера. Используется уже давно существующий ForkJoinPool.

Честно говоря, я сам ещё нигде это не пытался применить (вроде как уже доступно как preview), но по демкам в интернете выглядит хорошо.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Киллер фича JDK 21 - virtual threads
От: σ  
Дата: 05.05.23 08:35
Оценка:
R>не совсем понятно в техническом плане что там они такого сделали
R>если в эршланге вытесняющий атом то в яве сделали каждую инструкцию что ли
R>ну т.е. как в обычном cpu где ОС каждый поток может прервать в любой момент
R>времени разбираться нет
R>так что если будет инфа о технических подробностях, закидывайте сюда

В ЖЕПе написано что time sharing нет, вытеснение на блокирующихся операциях
Re[5]: Киллер фича JDK 21 - virtual threads
От: reversecode google
Дата: 05.05.23 08:53
Оценка:
ну тогда так как я и сказал
го тоже вытесняет на блокирующих вызовах
плюс еще и на каждых вызовах любой его функции
Re: Киллер фича JDK 21 - virtual threads
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 08.05.23 10:49
Оценка:
Здравствуйте, ·, Вы писали:

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

Получается, так к какому-то варианту зелёных потоков которые были в первых джавах и вернулись?
Sic luceat lux!
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 08.05.23 13:12
Оценка:
Здравствуйте, Kernan, Вы писали:

K>·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.

K>Получается, так к какому-то варианту зелёных потоков которые были в первых джавах и вернулись?
Ну как бы не совсем. Зелёные потоки — это все потоки VM работают на одном реальном потоке и всё. А тут эти треды можно шедулить как душе угодно. Это альтернатива await/asynс, actors, корутин и прочего.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Киллер фича JDK 21 - virtual threads
От: Pavel Dvorkin Россия  
Дата: 08.05.23 13:33
Оценка:
Здравствуйте, ·, Вы писали:

·>Виртуальные треды перешедулятся на реальные треды в момент всяких многопоточных действий, типа locks, yield, sleep и т.п. Если виртуальный тред будет внутри себя крутить вычислительный цикл, то он займёт реальный тред. Т.е. кооперативная многозадачность или асинк с человеческим лицом.


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

·>Сами стеки — это маленькие кусочки порядка сотни байт.

Можно короче объяснить : если взять Win 16 и добавить работу на нескольких ядрах, то оно и получится. Только там в качестве потоков были задачи.
With best regards
Pavel Dvorkin
Re[2]: Киллер фича JDK 21 - virtual threads
От: vsb Казахстан  
Дата: 08.05.23 13:44
Оценка:
Здравствуйте, Kernan, Вы писали:

K>·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.

K>Получается, так к какому-то варианту зелёных потоков которые были в первых джавах и вернулись?

Не вернулись, а добавили. Это опциональная конструкция для использования которой нужно использовать специальное API (для запуска виртуального потока). Обычные потоки никуда не делись.

Как там эти потоки в жаве работали в те древние времена, мне самому интересно. В линуксе потоки в принципе были своеобразные тогда, не такие, как сейчас. На солярисе вроде жава умела в полноценные зелёные потоки, которые выполнялись на куче ОС потоков. На винде хз.
Отредактировано 08.05.2023 13:44 vsb . Предыдущая версия .
Re[3]: Киллер фича JDK 21 - virtual threads
От: SkyDance Земля  
Дата: 08.05.23 16:29
Оценка:
·>Там вообще эти жуткие акторы, иммутабельные сообщения только. Взять и и тупо расшарить данные между тредами — фигушки.

Именно это и позволяет практически неограниченную масштабируемость, а также многие другие ценные штуки вроде прямого запрета девелоперу выстрелить себе в ногу.

Но для начального освоения требуется чуть больше шевелить мозгами, что мешает популярности.
Re[6]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 08.05.23 17:00
Оценка:
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>·>Когда в при исполнении кода виртуального треда происходил блокировка/етс — стек сохраняется в куче, и добавляется таск в шедулер на продолжение. Шедулер берёт очередной таск, восстанавливает стек и монтирует его на реальный тред. И так по кругу.

PD>·>Сами стеки — это маленькие кусочки порядка сотни байт.
PD>Можно короче объяснить : если взять Win 16 и добавить работу на нескольких ядрах, то оно и получится. Только там в качестве потоков были задачи.
Честно говоря я не знаю как win16 работало и уж тем более внутренности. Но полагаю задачи надо хитрым образом описывать. Тут же обыкновенный плоский код плюс кучу видов многопоточных паттернов взаимодействия только из коробки — locks, cond-vars, latches, exchange, futures, concurrent collections, етс.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 08.05.23 17:02
Оценка:
Здравствуйте, SkyDance, Вы писали:

SD>·>Там вообще эти жуткие акторы, иммутабельные сообщения только. Взять и и тупо расшарить данные между тредами — фигушки.

SD>Именно это и позволяет практически неограниченную масштабируемость, а также многие другие ценные штуки вроде прямого запрета девелоперу выстрелить себе в ногу.
SD>Но для начального освоения требуется чуть больше шевелить мозгами, что мешает популярности.
В этом и прикол, что сабж позволяет то же, но без высокого порога вхождения.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Киллер фича JDK 21 - virtual threads
От: reversecode google
Дата: 08.05.23 19:20
Оценка: :)
зеленые потоки которые вернули в яву и размазал на форк джин пуле
https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/
как оказывается форк джоин пул явовский уже умеет ворк стилинг
а именно вокруг него и прыгали разрабы токио пытаясь его слизать с го
а потом и в котлине итд скомуниздили

в чем то, это тоже самое что сделали в расте, только в расте это стеклесс корутины

жаль не удалось нагуглить(https://github.com/openjdk/) сами изменения которые внесены в jvm и sdk
но поверхностно теперь понятно
Re[5]: Киллер фича JDK 21 - virtual threads
От: SkyDance Земля  
Дата: 08.05.23 20:12
Оценка:
·>В этом и прикол, что сабж позволяет то же, но без высокого порога вхождения.

Порог вхождения в Java на самом деле намного выше.
Спасает только sunk cost, то, что люди уже потратили годы (начиная со школы, или самостоятельного изучения). В Британии мне понравилось, что некоторые профессоры в их министерство образования пытаются продвинуть чуть более разнообразные программы. Чтобы у детей было понимание других вариантов, кроме императивщины и прочих лого-бейсиков. От которых, понятное дело, путь в Джаву проще, чем в функциональные языки.
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 08.05.23 20:53
Оценка:
Здравствуйте, reversecode, Вы писали:

r> а именно вокруг него и прыгали разрабы токио пытаясь его слизать с го

Что за токио?

r> жаль не удалось нагуглить(https://github.com/openjdk/) сами изменения которые внесены в jvm и sdk

https://github.com/openjdk/jdk/pull/13203
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Киллер фича JDK 21 - virtual threads
От: reversecode google
Дата: 08.05.23 20:56
Оценка:
https://tokio.rs/blog/2019-10-scheduler
Re: Киллер фича JDK 21 - virtual threads
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.05.23 22:52
Оценка:
Здравствуйте, ·, Вы писали:

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

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

В яву завезли goroutines?
Re[2]: Киллер фича JDK 21 - virtual threads
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.05.23 22:53
Оценка:
Здравствуйте, σ, Вы писали:

σ>А вот в ирланге preemption есть


А в гошечке не только preemption есть, но еще и компиляция в машинный код.
Re[3]: Киллер фича JDK 21 - virtual threads
От: SkyDance Земля  
Дата: 08.05.23 23:28
Оценка:
Pzz>А в гошечке не только preemption есть, но еще и компиляция в машинный код.

В Erlang'е тоже. Причем сначала было именно как "компиляция" (HiPE), потом сделали нормальный JIT/AOT (и грохнули неудобный HiPE).
Re[4]: Киллер фича JDK 21 - virtual threads
От: Pzz Россия https://github.com/alexpevzner
Дата: 08.05.23 23:41
Оценка:
Здравствуйте, SkyDance, Вы писали:

Pzz>>А в гошечке не только preemption есть, но еще и компиляция в машинный код.


SD>В Erlang'е тоже. Причем сначала было именно как "компиляция" (HiPE), потом сделали нормальный JIT/AOT (и грохнули неудобный HiPE).


Ерланг же динамически типизован. Разве в динамически типизованном языке возможна генерация эффективного кода?
Re[3]: Киллер фича JDK 21 - virtual threads
От: vsb Казахстан  
Дата: 09.05.23 01:21
Оценка:
Здравствуйте, Pzz, Вы писали:

σ>>А вот в ирланге preemption есть


Pzz>А в гошечке не только preemption есть, но еще и компиляция в машинный код.


В жаве тоже есть.
Re[5]: Киллер фича JDK 21 - virtual threads
От: SkyDance Земля  
Дата: 09.05.23 04:54
Оценка:
Pzz>Ерланг же динамически типизован. Разве в динамически типизованном языке возможна генерация эффективного кода?

Там строгая система типов. Конструкции типа 2 + "string" являются ошибочными. И вообще, динамическая типизация — свойство компиляторе, в AOT есть часть загрузчика байт-кода.

Конкретно Erlang решает эту задачу путем внедрения compiler type information в байт-код. Тут здорово помогает тот факт, что все переменные иммутабельны, и их тип может быть выведен заранее на этапе компиляции.

PS: обрати внимание на dialyzer. Он вообще все типы выводит статически.
Re[2]: Киллер фича JDK 21 - virtual threads
От: scf  
Дата: 09.05.23 05:16
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>В яву завезли goroutines?


Нет, это невытесняющая многозадачность, реализованная на уровне JVM. Когда код вызывает любую блокирующую операцию (wait/sleep/synchronized/blocking io), управление передается в джавовый планировщик, который сохранит текущий стек и запустит на выполнение какой-нибудь другой кусок кода с сохраненным стеком.
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 09.05.23 11:21
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz> В яву завезли goroutines?

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

Виртуальные треды же — это обычные треды, но с кооперативной многозадачностью. Никаких изменений в ЯП нет, всё на уровне рантайма, просто теперь можно выполнять обычный код с классическими локами и тому подобными обычными механизмами синхронизации между тредами, но без накладных расходов которые связаны с реальными ОС-тредами.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.05.23 15:00
Оценка:
Здравствуйте, ·, Вы писали:

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


Каким образом джава узнает, что вон тот метод у нас работает долго и при его вызове надо бы перешедулить?
Re: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 09.05.23 15:02
Оценка:
Здравствуйте, ·, Вы писали:

·>В сентябре обещают зарелизить JEP 444


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

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

Можно. Судя по тому, что джава-девелоперы до сих пор удивляются лямбдам и сидят на джава 1.8, эта фича в массы дойдет лет через 10, а к тому времени её возьмут и выбросят, как это было с зелеными потоками.
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 09.05.23 16:16
Оценка: 21 (1)
Здравствуйте, Pauel, Вы писали:

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

P>Каким образом джава узнает, что вон тот метод у нас работает долго и при его вызове надо бы перешедулить?
Тут уже отвечали.
Помимо обычных блокировок в виде локов, они ещё переработали синхронное IO, например. Т.е. тупой линейный код как в go socket.readAllBytes(); ... socket.write(response);, тред для каждого клиента и внутре случается магия всяких epoll, виртуальный тред на блокирующем io так же перешедуливается.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Киллер фича JDK 21 - virtual threads
От: vsb Казахстан  
Дата: 09.05.23 17:02
Оценка:
Здравствуйте, Pauel, Вы писали:

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


P>Каким образом джава узнает, что вон тот метод у нас работает долго и при его вызове надо бы перешедулить?


Насколько я понимаю — никаким. Вечный цикл займёт тред навсегда. И если треды кончатся, то всё встанет колом (в отличие от настоящих потоков).
Re[5]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 09.05.23 17:47
Оценка:
Здравствуйте, vsb, Вы писали:

P>>Каким образом джава узнает, что вон тот метод у нас работает долго и при его вызове надо бы перешедулить?

vsb>Насколько я понимаю — никаким. Вечный цикл займёт тред навсегда. И если треды кончатся, то всё встанет колом (в отличие от настоящих потоков).
Тут немного не так. Точнее совсем не так.
Если бесконечный цикл — ошибка в коде, то виртуальный тред займёт настоящий и никакому другому виртуальному треду больше не отдаст, будет жрать cpu. По сути виртуальный тред как бы выродится в настоящий. Т.е. это утечка ресурса.
Если это просто некий временный load burst и большое число виртуальных тредов начнёт чего-то усердно считать, то они начнут захапывать реальные треды из пула. И там уже от настроек пула зависит. Например, пул может пытаться неограниченно создавать новые реальные треды пока память не закончится или ОС не начнёт протестовать. По дефолту пул, вроде, ограничивается числом ядер в cpu.

Т.е. всё как настоящие потоки получается. Плохая кооперация виртуальных тредов тупо вырождает их в настоящие. Единственное, что пропадает fairness — те виртуальные треды которые захапали все настоящие, то остальным виртуальным тредам ничего не достанется, пока те не начнут отдавать захапанное.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 09.05.2023 17:49 · . Предыдущая версия .
Re[3]: Киллер фича JDK 21 - virtual threads
От: Pzz Россия https://github.com/alexpevzner
Дата: 09.05.23 17:59
Оценка:
Здравствуйте, ·, Вы писали:

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


В каком смысле, не состыкуются. В go есть локи, а есть каналы. Что хочешь, то и пользуй. То, что там есть специальный синтаксис для запуска потока разве чего-то меняет?
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 09.05.23 19:01
Оценка:
Здравствуйте, Pauel, Вы писали:

P> Можно. Судя по тому, что джава-девелоперы до сих пор удивляются лямбдам и сидят на джава 1.8,

Ну на 1.8 сидят далеко не все, обычно те, у которых очень много легаси кода. Но, как мне кажется, сабж может быть хорошим преимуществом — запускать древний синхронный тормозной код асинхронно. Т.е. взять старый код с бизнес логикой, которая ходит синхронно туда-сюда в базу, в файлы, в SOAP и т.п, и замасштабировать на тысячи тредов, без пенальти от ОС.

А я что-то не припомню фич между 1.8 и JDK 20 которые как-то могут улучшить работу и использование старого кода, обычно только упрощения для написания нового. Ну может какие-то новые алгоритмы GC... дополнительные всяческие оптимизации, да и наверное всё.

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

По-моему зелёные потоки были по сути затычкой к ОС-тредам в то время, когда среди ОС реализация тредов была большим разбродом и шатанием, да и многопроцессорные системы были редкостью.
Когда большинство ОС стали более менее вменяемо уметь в треды, то их и выкинули, тупо за ненадобностью.

Сейчас же стал популярен асинхронный код, для которого и сделали сабж.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 09.05.23 19:13
Оценка:
Здравствуйте, Pzz, Вы писали:

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

Pzz> В каком смысле, не состыкуются. В go есть локи, а есть каналы. Что хочешь, то и пользуй. То, что там есть специальный синтаксис для запуска потока разве чего-то меняет?
В принципе да, для go это немного другое, т.к. там аналога VM нет. Java это платформа, там крутятся много языков. Если бы сабж реализовали как спец-синтаксис в ЯП — было бы жуть.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Киллер фича JDK 21 - virtual threads
От: Aquilaware  
Дата: 09.05.23 20:46
Оценка:
Здравствуйте, ·, Вы писали:

·>Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.


Получается автоматическая асинхроность без всякого переписывания кода. Умно, ждем в .NET такое.
Re[2]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 09.05.23 21:09
Оценка:
A>·>Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.

A>Получается автоматическая асинхроность без всякого переписывания кода. Умно, ждем в .NET такое.


Ну как не переписывать: нужно как минимум создать экземпляр VirtualThread и запихнуть туда лямбду с кодом (а если ещё вспомнить, что лямбды в Java не умеют захватывать неконстантные переменные в отличие от C#)
Из статьи на которую ссылается TC, преимущество перед async/await неочевидно (там сравнение с async/await в Котлине)
(https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/)
Re[3]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 09.05.23 21:25
Оценка:
·>Виртуальные треды же — это обычные треды, но с кооперативной многозадачностью. Никаких изменений в ЯП нет, всё на уровне рантайма, просто теперь можно выполнять обычный код с классическими локами и тому подобными обычными механизмами синхронизации между тредами, но без накладных расходов которые связаны с реальными ОС-тредами.

Погодите, а как же cancellation?
Вот в C# например я не могу использовать обычную lock секцию с async/await и вместо этого вынужден делать крит. секцию на основе SemaphoreSlim, где есть асинхронный wait и Cancellation.
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 09.05.23 22:01
Оценка:
Здравствуйте, m2user, Вы писали:

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

m> Погодите, а как же cancellation?
Банальный interrupt() например, доступный ещё с java 1.0.
Ну или Future.cancel() или любой другой паттерн.

Просто представь себе как бы ты писал простой, читабельный код, если ты знаешь, что там будет максимум десяток тредов. И представь себе, что этот код потом можно отмасштабировать на миллионы.

m> Вот в C# например я не могу использовать обычную lock секцию с async/await и вместо этого вынужден делать крит. секцию на основе SemaphoreSlim, где есть асинхронный wait и Cancellation.

Именно. Вот об этом гне и говорю. Есть Wait, и ещё нужен AsyncWait и ещё с CancellationToken . Итого намножилось аж 12 методов. И это приходится размазывать повсюду.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 09.05.2023 22:03 · . Предыдущая версия .
Re[3]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 09.05.23 22:01
Оценка:
Здравствуйте, m2user, Вы писали:

m> A>·>Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.

m> A>Получается автоматическая асинхроность без всякого переписывания кода. Умно, ждем в .NET такое.
m> Ну как не переписывать: нужно как минимум создать экземпляр VirtualThread и запихнуть туда лямбду с кодом
Лямбды тут непричём. Вообще.
wiring код немного поменяются. И собственно всё. Вся бизнес-логика остаётся как есть, и можно масштабировать старинный код, который все боятся трогать.

m>(а если ещё вспомнить, что лямбды в Java не умеют захватывать неконстантные переменные в отличие от C#)

Шо?! Они переменные со стека не умеют захватывать только. Как собственно и в шарпе.

m> Из статьи на которую ссылается TC, преимущество перед async/await неочевидно (там сравнение с async/await в Котлине)

m> (https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/)
С тем, что код тупой, обычный, синхронный, понятный любому индусу, без всякого мусора async/await, возможно написанный ещё до создания самого c#. Гугли "function coloring".
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[5]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 09.05.23 23:25
Оценка: 21 (1)
m>> Погодите, а как же cancellation?
·>Банальный interrupt() например, доступный ещё с java 1.0.
·>Ну или Future.cancel() или любой другой паттерн.

И как это применимо к классическим локам без переписывания кода?
Если мне нужно отменить ожидание на lock, то придется его в VirtualThread обернуть?

Дополнение:
Согласно документации
Thread.interrupt не действует на обычную synchronized секцию, и не на любой Lock

Further, the ability to interrupt the ongoing acquisition of a lock may not be available in a given Lock class

Кроме того, согласно https://openjdk.org/jeps/444

There are two scenarios in which a virtual thread cannot be unmounted during blocking operations because it is pinned to its carrier:

When it executes code inside a synchronized block or method, or
When it executes a native method or a foreign function.


В JEP предлагают заменить synchronized block на ReentrantLock, т.е. придется править код.


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


m>> Вот в C# например я не могу использовать обычную lock секцию с async/await и вместо этого вынужден делать крит. секцию на основе SemaphoreSlim, где есть асинхронный wait и Cancellation.

·>Именно. Вот об этом гне и говорю. Есть Wait, и ещё нужен AsyncWait и ещё с CancellationToken . Итого намножилось аж 12 методов. И это приходится размазывать повсюду.

Так и VirtualThread тоже самое.
Вместо await Task будет VirtualThread.join

Как в примере, из статьи на которую ты ссылался
@SneakyThrows
static void concurrentMorningRoutine() {
  var bathTime = bathTime();
  var boilingWater = boilingWater();
  bathTime.join();
  boilingWater.join();
}
Отредактировано 10.05.2023 0:44 m2user . Предыдущая версия .
Re[4]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 09.05.23 23:28
Оценка:
·>Лямбды тут непричём. Вообще.
·>wiring код немного поменяются. И собственно всё. Вся бизнес-логика остаётся как есть, и можно масштабировать старинный код, который все боятся трогать.

Можно и без лямбд, но Runnable/Callable при создании VirtualThread передать придется.

m>>(а если ещё вспомнить, что лямбды в Java не умеют захватывать неконстантные переменные в отличие от C#)

·>Шо?! Они переменные со стека не умеют захватывать только. Как собственно и в шарпе.

Разницу C# и Java применительно к захвату переменных лямбдами обсуждали тут: Класс для возврата значения из лямбды
Мне для получения результата Callable, обернутого в VirtualThread, придется к таким же ухищрениям прибегать, как в той теме?

m>> Из статьи на которую ссылается TC, преимущество перед async/await неочевидно (там сравнение с async/await в Котлине)

m>> (https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/)
·>С тем, что код тупой, обычный, синхронный, понятный любому индусу, без всякого мусора async/await, возможно написанный ещё до создания самого c#. Гугли "function coloring".

Ты утверждал, что код остается "плоским", однако из примеров в статье видно, что вложенность увеличивается

static Thread bathTime() {
  return virtualThread(
    "Bath time",
    () -> {
      log("I'm going to take a bath");
      sleep(Duration.ofMillis(500L));
      log("I'm done with the bath");
    });
}


И что насчет перехвата исключений? Перехватывать нужно внутри VirtualThread?
Re[5]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 10.05.23 00:30
Оценка: 7 (1)
M>Мне для получения результата Callable, обернутого в VirtualThread, придется к таким же ухищрениям прибегать, как в той теме?

M>И что насчет перехвата исключений? Перехватывать нужно внутри VirtualThread?


Посмотрел https://openjdk.org/jeps/444
Там есть поясняющий пример:
void handle(Request request, Response response) {
    var url1 = ...
    var url2 = ...
 
    try (var executor = Executors.newVirtualThreadPerTaskExecutor()) {
        var future1 = executor.submit(() -> fetchURL(url1));
        var future2 = executor.submit(() -> fetchURL(url2));
        response.send(future1.get() + future2.get());
    } catch (ExecutionException | InterruptedException e) {
        response.fail(e);
    }
}
 
String fetchURL(URL url) throws IOException {
    try (var in = url.openStream()) {
        return new String(in.readAllBytes(), StandardCharsets.UTF_8);
    }
}


По-видимому Executors.newVirtualThreadPerTaskExecutor — предполагаемое решение для обоих случаев.
Но разворачивать ExecutionException до IOException придется вручную
Re[5]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 09:17
Оценка:
Здравствуйте, m2user, Вы писали:

M>·>Лямбды тут непричём. Вообще.

M>·>wiring код немного поменяются. И собственно всё. Вся бизнес-логика остаётся как есть, и можно масштабировать старинный код, который все боятся трогать.
M>Можно и без лямбд, но Runnable/Callable при создании VirtualThread передать придется.
Не понял. Для реального треда тоже. И что?

m>>>(а если ещё вспомнить, что лямбды в Java не умеют захватывать неконстантные переменные в отличие от C#)

M>·>Шо?! Они переменные со стека не умеют захватывать только. Как собственно и в шарпе.
M>Разницу C# и Java применительно к захвату переменных лямбдами обсуждали тут: Класс для возврата значения из лямбды
Просто шарп компилятор создаёт класс, неявно делая переменную которая выглядит как на стеке полем класса. Грабля как из javascript.
Лично мне подход java нравится больше, т.к. никакой магии не делается, всё явно, никаких сюрпризов.

M>Мне для получения результата Callable, обернутого в VirtualThread, придется к таким же ухищрениям прибегать, как в той теме?

У callable есть возвращаемое значение.
Ты, видимо, что-то не так понял. Для запуска треда хоть реального, хоть виртуального, тебе надо как-то передать код который будет там работать. Это везде так, и в C# и даже в C. И к сабжу это никакого отношения не имеет.
Для более удобных способов обмена данными между тредами есть свой инструментарий, очень много разного.

И никакого публичного класса VirtualThread нет. С сабжем у тебя в коде будет всё тот же класс Thread из java 1.0. Меняется только способ создания экземпляра класса.

m>>> Из статьи на которую ссылается TC, преимущество перед async/await неочевидно (там сравнение с async/await в Котлине)

m>>> (https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/)
M>·>С тем, что код тупой, обычный, синхронный, понятный любому индусу, без всякого мусора async/await, возможно написанный ещё до создания самого c#. Гугли "function coloring".
M>Ты утверждал, что код остается "плоским", однако из примеров в статье видно, что вложенность увеличивается
Увеличивается по сравнению с чем?

M>И что насчет перехвата исключений? Перехватывать нужно внутри VirtualThread?

Ничего не меняется. Как работало с обычными Thread, так и будет.

Иными словами, весь существующий threading API у тебя сохраняется как есть. А сабж даёт тебе возможность запустить миллион тредов.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.05.23 10:47
Оценка:
Здравствуйте, m2user, Вы писали:

M>Так и VirtualThread тоже самое.

M>Вместо await Task будет VirtualThread.join

M>Как в примере, из статьи на которую ты ссылался

M>
M>@SneakyThrows
M>static void concurrentMorningRoutine() {
M>  var bathTime = bathTime();
M>  var boilingWater = boilingWater();
M>  bathTime.join();
M>  boilingWater.join();
M>}
M>


Лично мне больше нравится вариант джавы, а то все эти async/await как будто не лезут в голову молодому поколению девелоперов. Хотя, в целом, трудно сказать, насколько легко будет писать код для новой версии джавы. Наверняка там тоже будет много хитрых вещей "вызывайте вот это, если на двадцать уровней по стеку вверх не было вон того"
Re[4]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.05.23 10:50
Оценка:
Здравствуйте, ·, Вы писали:

·>wiring код немного поменяются. И собственно всё. Вся бизнес-логика остаётся как есть, и можно масштабировать старинный код, который все боятся трогать.


Старинный код скорее всего сделан последовательным и он будет скорее всего нереэнтерабельным, да с тред-локал. Соответсвенно уже на этом можно нарыть кучу граблей, если сделать такое многопоточным.
Re[6]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 11:19
Оценка:
Здравствуйте, m2user, Вы писали:

M>>Мне для получения результата Callable, обернутого в VirtualThread, придется к таким же ухищрениям прибегать, как в той теме?

M>>И что насчет перехвата исключений? Перехватывать нужно внутри VirtualThread?
M>По-видимому Executors.newVirtualThreadPerTaskExecutor — предполагаемое решение для обоих случаев.
Это такой пример. Тут из треда который выполняет handle (которых уже может быть овердофига), запускается ещё два новых треда и ожидается их завершение.
Покажи аналогичный код лучше.

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

Заметь, там есть readAllBytes в двух тредах. Т.е. это вот так выглядит асинхронный IO с epoll теперь.

M>Но разворачивать ExecutionException до IOException придется вручную

Зачем? И почему _придётся_?
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 10.05.2023 11:28 · . Предыдущая версия .
Re[5]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 11:25
Оценка:
Здравствуйте, Pauel, Вы писали:

P>·>wiring код немного поменяются. И собственно всё. Вся бизнес-логика остаётся как есть, и можно масштабировать старинный код, который все боятся трогать.

P>Старинный код скорее всего сделан последовательным и он будет скорее всего нереэнтерабельным, да с тред-локал.
Дык тред-локал он и для виртуального треда локал!

P> Соответсвенно уже на этом можно нарыть кучу граблей, если сделать такое многопоточным.

Я имею в виду, что у тебя есть некий скажем http-сервер, в хендлерах которых у тебя последовательный код, который ходит в базу, в файлы, етс, и отдаёт результат — и всё последовательно. Сейчас такое можно намасштабировать на 200 одновременных соединений, по треду на каждое, начнёт разбухать память и т.п. С сабжем треды будут виртуальные и их можно дофига.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 11:49
Оценка:
Здравствуйте, m2user, Вы писали:

M>·>Банальный interrupt() например, доступный ещё с java 1.0.

M>·>Ну или Future.cancel() или любой другой паттерн.
M>И как это применимо к классическим локам без переписывания кода?
M>Если мне нужно отменить ожидание на lock, то придется его в VirtualThread обернуть?
Непонятно что ты хочешь. Виртуальные треды не дают какой-то новый дополнительный контроль над локами. Они просто позволяют запускать больше тредов, чем ОС может себе позволить.
Если у тебя в коде не было возможности прервать какой-то лок, то она не появится магически. Просто пока миллион тредов висят на этом локе, ещё миллион тредов могут продолжать работать.

M>В JEP предлагают заменить synchronized block на ReentrantLock, т.е. придется править код.

Да, ложка дёгтя есть. Вроде обещают исправить: "In a future release we may be able to remove pinning inside synchronized".

m>>> Вот в C# например я не могу использовать обычную lock секцию с async/await и вместо этого вынужден делать крит. секцию на основе SemaphoreSlim, где есть асинхронный wait и Cancellation.

M>·>Именно. Вот об этом гне и говорю. Есть Wait, и ещё нужен AsyncWait и ещё с CancellationToken . Итого намножилось аж 12 методов. И это приходится размазывать повсюду.

M>Так и VirtualThread тоже самое.

M>Вместо await Task будет VirtualThread.join
Не совсем. Этот await не нужно протаскивать везде.
Т.е. у тебя есть какой-то обычный бизнес-код с синхронным readAllBytes — и у него никакого Task/async нет. И join нужен только собственно чтобы дождаться результата от всех тредов.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 10.05.23 12:27
Оценка:
Здравствуйте, ·, Вы писали:

·>Дык тред-локал он и для виртуального треда локал!


Особенность виртуальных тредов и важный бенефит — ничтожный футпринт по памяти. С тред локалами эта особенность исчезает.

·>Я имею в виду, что у тебя есть некий скажем http-сервер, в хендлерах которых у тебя последовательный код, который ходит в базу, в файлы, етс, и отдаёт результат — и всё последовательно. Сейчас такое можно намасштабировать на 200 одновременных соединений, по треду на каждое, начнёт разбухать память и т.п. С сабжем треды будут виртуальные и их можно дофига.


Если разрабы позаботились и жестко изолировались от фремворка http-сервера, то будет бенефит и можно масштабировать.
Но реально такой изоляцией судя по коду мало кто занимается.
На собесах любят поговорить про Clean Architecture, fremwork as a detail и тд, но вот в реальном мире таких применений ничтожное количество.
И это видно в тестах — на самом низком уровне люди пишут моки т.к. ктото где то в тредлокалах прокидывает чорт знает что.
Re[7]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 12:41
Оценка: +1
Здравствуйте, Pauel, Вы писали:

P>·>Дык тред-локал он и для виртуального треда локал!

P>Особенность виртуальных тредов и важный бенефит — ничтожный футпринт по памяти. С тред локалами эта особенность исчезает.
А... ну да. Если тред-локал используется для протаскивания UserId, то ок.
А если кто-то решил, что тред-локал это хорошее место куда можно забабахать потокобезопасный кеш, а про ConcurrentHashMap ему не рассказали, "ведь тредов всё равно не может быть больше сотни", то да, не получится отмасштабировать as-is, придётся переписывать.

P>·>Я имею в виду, что у тебя есть некий скажем http-сервер, в хендлерах которых у тебя последовательный код, который ходит в базу, в файлы, етс, и отдаёт результат — и всё последовательно. Сейчас такое можно намасштабировать на 200 одновременных соединений, по треду на каждое, начнёт разбухать память и т.п. С сабжем треды будут виртуальные и их можно дофига.

P>Если разрабы позаботились и жестко изолировались от фремворка http-сервера, то будет бенефит и можно масштабировать.
P>Но реально такой изоляцией судя по коду мало кто занимается.
Servlet API это подразумевает.

P>На собесах любят поговорить про Clean Architecture, fremwork as a detail и тд, но вот в реальном мире таких применений ничтожное количество.

В ентерпрайзе, который сидит на 1.8 — дофига. (

P>И это видно в тестах — на самом низком уровне люди пишут моки т.к. ктото где то в тредлокалах прокидывает чорт знает что.

Ну по сути это глобальный Map<ThreadId, Object>. Вот что будет Object — уже от ситуации зависит...
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[6]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 10.05.23 14:27
Оценка:
·>Не понял. Для реального треда тоже. И что?

·>И никакого публичного класса VirtualThread нет. С сабжем у тебя в коде будет всё тот же класс Thread из java 1.0. Меняется только способ создания экземпляра класса.


M>>·>С тем, что код тупой, обычный, синхронный, понятный любому индусу, без всякого мусора async/await, возможно написанный ещё до создания самого c#. Гугли "function coloring".

M>>Ты утверждал, что код остается "плоским", однако из примеров в статье видно, что вложенность увеличивается
·>Увеличивается по сравнению с чем?

M>>И что насчет перехвата исключений? Перехватывать нужно внутри VirtualThread?

·>Ничего не меняется. Как работало с обычными Thread, так и будет.

·>Иными словами, весь существующий threading API у тебя сохраняется как есть. А сабж даёт тебе возможность запустить миллион тредов.


Да, я в курсе, что тип Thread остался старый.

Тут нужно определиться, к какому legacy коду ты собираешься применить virtualThread.
Если речь идет о http сервере (в этом твоем сообщении Киллер фича JDK 21 — virtual threads), в котором уже использются тяжеловесные треды (по одному на запрос), то конечно перевести его на легковесные вируальные треды (и получить экономию ресурсов) легко.
По сути нужно только заменить Lock на их interruptible версии.

Если же речь о коде, где нужно распараллелить операции, которые до этого выполнялись последовательно, то такой код понадобится раздробить на Runnable/Callable составляющие (функции или лямбды), попутно переписывая работу с переменными на стеке, возвратом результата, обработкой исключений.

Я утверждаю, что для такого кода:
1) по объему работы это не проще перевода на await/async
2) await/async позволил бы писать более "плоский" код (меньше вложенных блоков кода)

Executors.newVirtualThreadPerTaskExecutor, которыей я упомянул в соседнем сообщении, частично облегчает ситуацию — с возвратом результата Callable и пробросом исключения (в виде ExecutionException)
Re[7]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 10.05.23 14:36
Оценка:
M>>По-видимому Executors.newVirtualThreadPerTaskExecutor — предполагаемое решение для обоих случаев.
·>Это такой пример. Тут из треда который выполняет handle (которых уже может быть овердофига), запускается ещё два новых треда и ожидается их завершение.
·>Покажи аналогичный код лучше.

Async/await, как оно сделано в C#. Но конечно оно потребует и async версии readAllBytes.

M>>Но разворачивать ExecutionException до IOException придется вручную

·>Зачем? И почему _придётся_?

Для реализации нетривиальной логики обработки IOException — либо обрабатывать внутри fetchURL, либо разворачивать ExecutionException до IOException.
Re[7]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 10.05.23 14:48
Оценка:
m>>>> Вот в C# например я не могу использовать обычную lock секцию с async/await и вместо этого вынужден делать крит. секцию на основе SemaphoreSlim, где есть асинхронный wait и Cancellation.
M>>·>Именно. Вот об этом гне и говорю. Есть Wait, и ещё нужен AsyncWait и ещё с CancellationToken . Итого намножилось аж 12 методов. И это приходится размазывать повсюду.

M>>Так и VirtualThread тоже самое.

M>>Вместо await Task будет VirtualThread.join
·>Не совсем. Этот await не нужно протаскивать везде.
·>Т.е. у тебя есть какой-то обычный бизнес-код с синхронным readAllBytes — и у него никакого Task/async нет. И join нужен только собственно чтобы дождаться результата от всех тредов.

Это неполноценный асинхронный код, т.к. нет cancellation.
Если реализовать cancellation (как я понимаю, применительно к IO в Java это делается через AsynchronousChannel), то будут Future (вместо Task). И в итоге можно получить тот же function coloring
Re[7]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 14:58
Оценка:
Здравствуйте, m2user, Вы писали:

M>Если же речь о коде, где нужно распараллелить операции, которые до этого выполнялись последовательно, то такой код понадобится раздробить на Runnable/Callable составляющие (функции или лямбды), попутно переписывая работу с переменными на стеке, возвратом результата, обработкой исключений.


M>Я утверждаю, что для такого кода:

M>1) по объему работы это не проще перевода на await/async
На порядок проще.
Вот у тебя код:
var details1 = someBigDao.complexBusinessLogicWhichDoesALotOfSQLQueriesSynchronously();//работает 20 секунд
var details2 = someService.itGoesToNetworkAndDownloadsDataUsingSomeCrazySoapFramework();//работает 30 секунд
return compbine(details1, details2);//общее время 50 секунд

В шарпе если ты такой код завернёшь в async, то толку никакого, т.к. первый же sql.execute() полезет синхронно в сокет и заблокирует твой async пока тот ждёт ответа от sql-сервера. Чтобы эти два метода запустить и чтобы они работали одновременно — тебе нужно запустить два честных треда.
Либо переписать всё на async-методы, чтобы они протаскивали Task по всему коду:
Т.е. если где-то внутре есть код типа
Result complexBusinessLogicWhichDoesALotOfSQLQueriesSynchronously()
{
  var r1 = sql.query(aaa);
  var r2 = sql.query(bbb);
  var r3 = sql.query(ccc);
  var r4 = anotherStuffWhichDoesSql(r2);
  return new Result(....);
}

то каждый sql.query тебе нужно придётся оборачивать в async и так по всей глубине стека.

С виртуальными тредами — ты просто пускаешь эти два метода и они работают параллельно:

var details1 = executor.submit(() -> someDao.complexBusinessLogicWhichDoesALotOfSQLQueriesSynchronously());
var details2 = executor.submit(() -> someService.downloadDataUsingSomeCrazySoapFramework()));
return combine(details1.join(), details2.join());//общее время 30 секунд

Всё. Ничего внутри someDao или someService менять не нужно.

M>2) await/async позволил бы писать более "плоский" код (меньше вложенных блоков кода)

Не позволил бы. Или показывай что ты имеешь в виду.

M>Executors.newVirtualThreadPerTaskExecutor, которыей я упомянул в соседнем сообщении, частично облегчает ситуацию — с возвратом результата Callable и пробросом исключения (в виде ExecutionException)

Проброс исключений, callable и прочее не имеет никакого отношения к сабжу.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 10.05.2023 15:06 · . Предыдущая версия . Еще …
Отредактировано 10.05.2023 15:02 · . Предыдущая версия .
Re[7]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 15:04
Оценка:
Здравствуйте, ·, Вы писали:


·>Т.е. у тебя есть какой-то обычный бизнес-код с синхронным readAllBytes — и у него никакого Task/async нет. И join нужен только собственно чтобы дождаться результата от всех тредов.


Интересно а как сосуществуют виртуальные потоки с тасками?
https://learn.microsoft.com/en-us/dotnet/api/system.threading.asynclocal-1?redirectedfrom=MSDN&amp;view=net-7.0
и солнце б утром не вставало, когда бы не было меня
Re[7]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 15:14
Оценка: 6 (1)
Здравствуйте, m2user, Вы писали:

M>Executors.newVirtualThreadPerTaskExecutor, которыей я упомянул в соседнем сообщении, частично облегчает ситуацию — с возвратом результата Callable и пробросом исключения (в виде ExecutionException)

Наверное ты вот это хочешь. Но это уже не новости, в JDK 19 уже доступно:
Response handle() throws ExecutionException, InterruptedException {
    try (var scope = new StructuredTaskScope.ShutdownOnFailure()) {
        Future<String>  user  = scope.fork(() -> findUser());
        Future<Integer> order = scope.fork(() -> fetchOrder());

        scope.join();           // Join both forks
        scope.throwIfFailed();  // ... and propagate errors

        // Here, both forks have succeeded, so compose their results
        return new Response(user.resultNow(), order.resultNow());
    }
}


Опять же, это ортогонально к VT, работает на любых тредах, и на реальных, и на виртуальных.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 15:23
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Т.е. у тебя есть какой-то обычный бизнес-код с синхронным readAllBytes — и у него никакого Task/async нет. И join нужен только собственно чтобы дождаться результата от всех тредов.

S>Интересно а как сосуществуют виртуальные потоки с тасками?
Я вопрос не понял. Тасков нет никаких с виртуальными потоками.
Отдельный AsyncLocal никакой не нужен, т.к. работает ровно тот же ThreadLocal.

Помимо морально устаревшенго ThreadLocal пилят ещё ScopedValue
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 10.05.2023 15:28 · . Предыдущая версия .
Re[9]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 15:30
Оценка:
Здравствуйте, ·, Вы писали:

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


S>>·>Т.е. у тебя есть какой-то обычный бизнес-код с синхронным readAllBytes — и у него никакого Task/async нет. И join нужен только собственно чтобы дождаться результата от всех тредов.


S>>Интересно а как сосуществуют виртуальные потоки с тасками?

·>Я вопрос не понял. Тасков нет никаких с виртуальными потоками.
Ну например в .Net уже и не найти синхронных методов.
Я так понимаю, что перед вызовом readAllBytes сохраняется стек, вызывается асинхронный метод по завершении которого возвращается стек и продолжение происходит с после readAllBytes.

То есть компилятор должен знать что есть асинхронный readAllBytes?

Можно ли смешивать асинхронный код и виртуальные потоки?
и солнце б утром не вставало, когда бы не было меня
Re[8]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 15:52
Оценка:
Здравствуйте, m2user, Вы писали:

M>>>По-видимому Executors.newVirtualThreadPerTaskExecutor — предполагаемое решение для обоих случаев.

M>·>Это такой пример. Тут из треда который выполняет handle (которых уже может быть овердофига), запускается ещё два новых треда и ожидается их завершение.
M>·>Покажи аналогичный код лучше.
M>Async/await, как оно сделано в C#. Но конечно оно потребует и async версии readAllBytes.
Угу. И так по всему коду — всё потребует async версию.

M>>>Но разворачивать ExecutionException до IOException придется вручную

M>·>Зачем? И почему _придётся_?
M>Для реализации нетривиальной логики обработки IOException — либо обрабатывать внутри fetchURL, либо разворачивать ExecutionException до IOException.
Я не очень понимаю. Приведи пример. Для чего тебе требуется вынимать IOException? Если у тебя что-то работает в другом потоке, неважно виртуальном или реальном, то тебе нужно как-то передать исключение между потоками. Исключения обычно логгируют, да и всё.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[8]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 16:01
Оценка:
Здравствуйте, m2user, Вы писали:

M>·>Не совсем. Этот await не нужно протаскивать везде.

M>·>Т.е. у тебя есть какой-то обычный бизнес-код с синхронным readAllBytes — и у него никакого Task/async нет. И join нужен только собственно чтобы дождаться результата от всех тредов.
M>Это неполноценный асинхронный код, т.к. нет cancellation.
А зачем он везде в общем случае? Специальная конструкция как в CancellationToken не требуется.

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

Если у тебя есть какой-то сокет и ты хочешь прервать код, который на нём ждёт слишком долго, то поставь таймаут. Или если какое-то внешнее взаимодейсвтие, что сокет больше не нужен — закрой сокет. И т.п.
Т.е. какой-то универсальный cancellation не нужен.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[10]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 16:20
Оценка: 20 (1)
Здравствуйте, Serginio1, Вы писали:

S>·>Я вопрос не понял. Тасков нет никаких с виртуальными потоками.

S> Ну например в .Net уже и не найти синхронных методов.
Точнее количество методов удвоено — синхронный вариант и асинхронный.

S> Я так понимаю, что перед вызовом readAllBytes сохраняется стек, вызывается асинхронный метод по завершении которого возвращается стек и продолжение происходит с после readAllBytes.

S> То есть компилятор должен знать что есть асинхронный readAllBytes?
Нет никакого специального асинхронного readAllBytes. Как я понял отсюда, он отдаёт задание на чтение байтов реальному глобальному jvm-треду "Read-Poller" и блокируется в ожидании результата. Блокировка позволяет отсоединить виртуальный тред (сохраняя стек) и положить его в очередь.
И компилятор тут непричём. Это просто детали реализации socket api.

"<unnamed>" #15 virtual
  java.base/java.lang.Continuation.yield(Continuation.java:402)
...
  java.base/jdk.internal.misc.VirtualThreads.park(VirtualThreads.java:60)
...
  java.base/java.net.Socket$SocketInputStream.read(Socket.java:988)
...
  java.base/java.io.InputStream.readAllBytes(InputStream.java:346)

"Read-Poller" #16
  java.base@17-internal/sun.nio.ch.KQueue.poll(Native Method)
...
  java.base@17-internal/java.lang.Thread.run(Thread.java:1522)
  java.base@17-internal/jdk.internal.misc.InnocuousThread.run(InnocuousThread.java:161)


S> Можно ли смешивать асинхронный код и виртуальные потоки?

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


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


Где то в начале стека определилось, что не нужны дальнейшие вычисления. Как мне их все прервать по всему стеку?
и солнце б утром не вставало, когда бы не было меня
Re[11]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 16:25
Оценка:
Здравствуйте, ·, Вы писали:


S>> Я так понимаю, что перед вызовом readAllBytes сохраняется стек, вызывается асинхронный метод по завершении которого возвращается стек и продолжение происходит с после readAllBytes.

S>> То есть компилятор должен знать что есть асинхронный readAllBytes?
·>Нет никакого специального асинхронного readAllBytes. Как я понял отсюда, он отдаёт задание на чтение байтов реальному глобальному jvm-треду "Read-Poller" и блокируется в ожидании результата. Блокировка позволяет отсоединить виртуальный тред (сохраняя стек) и положить его в очередь.
·>И компилятор тут непричём. Это просто детали реализации socket api.

То есть это касается только сокетов?
и солнце б утром не вставало, когда бы не было меня
Re[12]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 16:40
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>И компилятор тут непричём. Это просто детали реализации socket api.

S> То есть это касается только сокетов?
Весь io.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[10]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 16:45
Оценка:
Здравствуйте, Serginio1, Вы писали:

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

S> Где то в начале стека определилось, что не нужны дальнейшие вычисления. Как мне их все прервать по всему стеку?
Можно пример?
Если ты в том же SemaphoreSlim вызывается async wait без cancellation token — как прервать?
Вообще cancellation ортогонален асинхронщине. Посмотри, там есть и синхронный wait с cancellation token.
Врочем, можно использовать thread.interrupt().
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 16:53
Оценка:
Здравствуйте, ·, Вы писали:

S>>·>И компилятор тут непричём. Это просто детали реализации socket api.

S>> То есть это касается только сокетов?
·>Весь io.
Ну это понятно. Просто Tаsk это не только IO.
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
и солнце б утром не вставало, когда бы не было меня
Re[11]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 16:56
Оценка:
Здравствуйте, ·, Вы писали:


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

S>> Где то в начале стека определилось, что не нужны дальнейшие вычисления. Как мне их все прервать по всему стеку?
·>Можно пример?
·>Если ты в том же SemaphoreSlim вызывается async wait без cancellation token — как прервать?
·>Вообще cancellation ортогонален асинхронщине. Посмотри, там есть и синхронный wait с cancellation token.
·>Врочем, можно использовать thread.interrupt().
Это конечно да!
Суть в том, что может быть цепочка асинхронных вызовов вплоть до рекурсии.
То есть внутри метода вызывает асинхронный метод и так далее
и солнце б утром не вставало, когда бы не было меня
Re[12]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 17:17
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Если ты в том же SemaphoreSlim вызывается async wait без cancellation token — как прервать?

S>·>Вообще cancellation ортогонален асинхронщине. Посмотри, там есть и синхронный wait с cancellation token.
S>·>Врочем, можно использовать thread.interrupt().
S> Это конечно да!
S> Суть в том, что может быть цепочка асинхронных вызовов вплоть до рекурсии.
S>То есть внутри метода вызывает асинхронный метод и так далее
Т.е. у тебя должен быть специально написанный код, который предусматривает прерывание в предусмотренных местах. Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[14]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 17:19
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Весь io.

S>Ну это понятно. Просто Tаsk это не только IO.
Именно IO доставляет проблемы потокам.

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

Это аналог Future или StructuredTaskScope как в примере выше. Тоже ортогонально тредам.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[13]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 17:26
Оценка:
Здравствуйте, ·, Вы писали:

S>> Суть в том, что может быть цепочка асинхронных вызовов вплоть до рекурсии.

S>>То есть внутри метода вызывает асинхронный метод и так далее
·>Т.е. у тебя должен быть специально написанный код, который предусматривает прерывание в предусмотренных местах. Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.
Конечно! Обычно методы и принимают параметр System.Threading.CancellationToken
https://learn.microsoft.com/ru-ru/dotnet/api/system.io.filestream.readasync?view=net-7.0
и солнце б утром не вставало, когда бы не было меня
Re[15]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 17:33
Оценка:
Здравствуйте, ·, Вы писали:

S>>·>Весь io.

S>>Ну это понятно. Просто Tаsk это не только IO.
·>Именно IO доставляет проблемы потокам.

Не обязательно. Народ запускает кучу параллельных потоков для распараллеливания задач, сервера, причем используют примитивы синхронизации.
С помощью Task можно решать кучу задач с помощь небольшого количества потоков.
Например SemaphoreSlim.WaitAsync
https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.semaphoreslim.waitasync?view=net-7.0
и солнце б утром не вставало, когда бы не было меня
Re[16]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 18:06
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>>>·>Весь io.

S>>>Ну это понятно. Просто Tаsk это не только IO.
S>·>Именно IO доставляет проблемы потокам.
S> Не обязательно. Народ запускает кучу параллельных потоков для распараллеливания задач, сервера, причем используют примитивы синхронизации.
S>С помощью Task можно решать кучу задач с помощь небольшого количества потоков.
Да ясен пень. Сабж как раз про то, что не нужно решать задачи с помощью Task, которому нужно специальные ключевые слова в язык, который требует от компилятора перекорёживать код, заставляет писать два варианта каждого метода, затрудняет понимание и отладку кода. Вместо этого можно просто иметь большое количество потоков.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[17]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 10.05.23 20:01
Оценка:
Здравствуйте, ·, Вы писали:

S>>>>Ну это понятно. Просто Tаsk это не только IO.

S>>·>Именно IO доставляет проблемы потокам.
S>> Не обязательно. Народ запускает кучу параллельных потоков для распараллеливания задач, сервера, причем используют примитивы синхронизации.
S>>С помощью Task можно решать кучу задач с помощь небольшого количества потоков.
·>Да ясен пень. Сабж как раз про то, что не нужно решать задачи с помощью Task, которому нужно специальные ключевые слова в язык, который требует от компилятора перекорёживать код, заставляет писать два варианта каждого метода, затрудняет понимание и отладку кода. Вместо этого можно просто иметь большое количество потоков.
Нееее. Это частный метод с одним уровнем. Как правило таски это многоуровневые вложения.
Я не вижу особых проблем с async/await. А вот с виртуальными потоками вижу. То есть совместно с тасками их не применить.
Это просто оптимизация не асинхронного кода. Коего не так уж и много в том же C#.
и солнце б утром не вставало, когда бы не было меня
Re[18]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 21:30
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Да ясен пень. Сабж как раз про то, что не нужно решать задачи с помощью Task, которому нужно специальные ключевые слова в язык, который требует от компилятора перекорёживать код, заставляет писать два варианта каждого метода, затрудняет понимание и отладку кода. Вместо этого можно просто иметь большое количество потоков.

S> Нееее. Это частный метод с одним уровнем. Как правило таски это многоуровневые вложения.
Нет. async/await — это виртуальные треды для бедных.

S> Я не вижу особых проблем с async/await. А вот с виртуальными потоками вижу. То есть совместно с тасками их не применить.

Тут уже несколько примеров приводили с Future и StructuredTaskScope.

S>Это просто оптимизация не асинхронного кода. Коего не так уж и много в том же C#.

Нет. Это возможность запускать асинхронно синхронный код c io и синхронизированный примитивами синхронизации код.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 10.05.2023 21:32 · . Предыдущая версия .
Re[14]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 10.05.23 22:27
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> ·>Т.е. у тебя должен быть специально написанный код, который предусматривает прерывание в предусмотренных местах. Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.

S> Конечно! Обычно методы и принимают параметр System.Threading.CancellationToken
Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Киллер фича JDK 21 - virtual threads
От: Kernan Ниоткуда https://rsdn.ru/forum/flame.politics/
Дата: 11.05.23 08:54
Оценка:
Здравствуйте, ·, Вы писали:

·>Ну как бы не совсем. Зелёные потоки — это все потоки VM работают на одном реальном потоке и всё. А тут эти треды можно шедулить как душе угодно.

Раньше так не умели просто, а сейчас научились. Если бы во времена первой джавы умели скедулить как хотят, то это было бы сделано сразу.
Sic luceat lux!
Re[19]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 08:58
Оценка:
Здравствуйте, ·, Вы писали:

S>>Это просто оптимизация не асинхронного кода. Коего не так уж и много в том же C#.

·>Нет. Это возможность запускать асинхронно синхронный код c io и синхронизированный примитивами синхронизации код.
Я тебе приводил пример асинхронных примитвов синхронизации. То есть ты повторил мои же выводы
и солнце б утром не вставало, когда бы не было меня
Re[15]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 09:02
Оценка:
Здравствуйте, ·, Вы писали:

S>> ·>Т.е. у тебя должен быть специально написанный код, который предусматривает прерывание в предусмотренных местах. Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.

S>> Конечно! Обычно методы и принимают параметр System.Threading.CancellationToken
·>Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.

Прямое! Вот куча примеров https://metanit.com/sharp/tutorial/12.5.php
https://learn.microsoft.com/ru-ru/dotnet/standard/threading/cancellation-in-managed-threads
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.05.2023 9:03 Serginio1 . Предыдущая версия .
Re[20]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 09:10
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>>>Это просто оптимизация не асинхронного кода. Коего не так уж и много в том же C#.

S>·>Нет. Это возможность запускать асинхронно синхронный код c io и синхронизированный примитивами синхронизации код.
S> Я тебе приводил пример асинхронных примитвов синхронизации. То есть ты повторил мои же выводы
По-моему ты что-то не понимаешь. Не нужны асинхронные примитивы синхронизации при наличии виртуальных тредов. Не нужно делать по два варианта каждой функции как в твоём примере "Wait" и "AsyncWait".
Ровно один и тот же синхронный код может выполняться как синхронно (при запуске на реальных тредах) так и асинхронно (при запуске на виртуальных тредах).
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[16]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 09:24
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> ·>Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.

S> Прямое! Вот куча примеров https://metanit.com/sharp/tutorial/12.5.php
S> https://learn.microsoft.com/ru-ru/dotnet/standard/threading/cancellation-in-managed-threads
И? Это ортогональные вещи. Ровно этот же CancellationToken используется так же и в синхронном коде.
В асинхронном, как я понял, оно кидает исключение, которое ловится в результат таска. В синхронном то же исключение вываливается напрямую.
Неясно зачем для этого было создавать какой-то специальный API. Наверно, просто для универсальности.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[21]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 09:27
Оценка:
Здравствуйте, ·, Вы писали:

S>>>>Это просто оптимизация не асинхронного кода. Коего не так уж и много в том же C#.

S>>·>Нет. Это возможность запускать асинхронно синхронный код c io и синхронизированный примитивами синхронизации код.
S>> Я тебе приводил пример асинхронных примитвов синхронизации. То есть ты повторил мои же выводы
·>По-моему ты что-то не понимаешь. Не нужны асинхронные примитивы синхронизации при наличии виртуальных тредов. Не нужно делать по два варианта каждой функции как в твоём примере "Wait" и "AsyncWait".
·>Ровно один и тот же синхронный код может выполняться как синхронно (при запуске на реальных тредах) так и асинхронно (при запуске на виртуальных тредах).

Еще раз IO это частный метод асинхронности. Task и выполняют огормную кучу задач вне IO.
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
Прежде всего с ипользованием TaskCompletionSource
https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.taskcompletionsource-1?view=net-7.0
https://habr.com/ru/articles/452094/
Есть смешение IO и TaskCompletionSource. И вторых намного больше!
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.05.2023 9:32 Serginio1 . Предыдущая версия .
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 09:31
Оценка:
Здравствуйте, Kernan, Вы писали:

K>·>Ну как бы не совсем. Зелёные потоки — это все потоки VM работают на одном реальном потоке и всё. А тут эти треды можно шедулить как душе угодно.

K>Раньше так не умели просто, а сейчас научились. Если бы во времена первой джавы умели скедулить как хотят, то это было бы сделано сразу.
Сразу после того, как добавили поддержку epoll/аналоги во все операционки. И потом java nio. И после того, как реализовали java.concurrent. Ну ещё method handlers. Да и без лямбд было бы грустно.
А так да, как только так сразу.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[17]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 09:46
Оценка:
Здравствуйте, ·, Вы писали:


S>> ·>Неясно какое отношение это имеет к асинхронщине или многопоточке. Это ортогональные вещи.

S>> Прямое! Вот куча примеров https://metanit.com/sharp/tutorial/12.5.php
S>> https://learn.microsoft.com/ru-ru/dotnet/standard/threading/cancellation-in-managed-threads
·>И? Это ортогональные вещи. Ровно этот же CancellationToken используется так же и в синхронном коде.
·>В асинхронном, как я понял, оно кидает исключение, которое ловится в результат таска. В синхронном то же исключение вываливается напрямую.
·>Неясно зачем для этого было создавать какой-то специальный API. Наверно, просто для универсальности.

Не обязательно.
Если ты читал есть
cts.Cancel(); if (token.IsCancellationRequested)


То есть ты должен либо опрашивать, если IsCancellationRequested == true
вызвать ThrowIfCancellationRequested

if (token.IsCancellationRequested)   
    throw new OperationCanceledException(token);

https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.cancellationtoken.throwifcancellationrequested?view=net-8.0

То есть нужно с некоторой периодичностью опрашивать token
https://learn.microsoft.com/ru-ru/dotnet/standard/threading/cancellation-in-managed-threads

Просто его можно пробросить в кучу задач в качестве параметра и отменить эти задачи. Вот простой смысл
и солнце б утром не вставало, когда бы не было меня
Re[22]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 09:54
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>По-моему ты что-то не понимаешь. Не нужны асинхронные примитивы синхронизации при наличии виртуальных тредов. Не нужно делать по два варианта каждой функции как в твоём примере "Wait" и "AsyncWait".

S>·>Ровно один и тот же синхронный код может выполняться как синхронно (при запуске на реальных тредах) так и асинхронно (при запуске на виртуальных тредах).

S>Еще раз IO это частный метод асинхронности. Task и выполняют огормную кучу задач вне IO.

Асинхронный IO — да, частный метод асинхронности. Но есть на свете ещё и синхронный IO. Вот такой тупой код, который писали десятки лет назад:
var data = socket.read();
var newData = processData(data);
socket.write(newData);
...

Это простой синхронный код с IO. Который легко писать, легко понимать и легко отлаживать. Виртуальные треды могут запускать его асинхронно, без изменений.

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

S>Прежде всего с ипользованием TaskCompletionSource
S>https://learn.microsoft.com/ru-ru/dotnet/api/system.threading.tasks.taskcompletionsource-1?view=net-7.0
S> Есть смешение IO и TaskCompletionSource. И вторых намного больше!
Так писать тоже можно. Но можно писать проще.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[18]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 09:59
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>И? Это ортогональные вещи. Ровно этот же CancellationToken используется так же и в синхронном коде.

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

S>> Есть смешение IO и TaskCompletionSource. И вторых намного больше!

·>Так писать тоже можно. Но можно писать проще.

Вот именно, что Task и позволяют писать проще. IO это очень частный случай и подходит для старых проектов. Но это не киллер фича.
и солнце б утром не вставало, когда бы не было меня
Re[19]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 10:11
Оценка:
Здравствуйте, ·, Вы писали:


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

·>Это всё понятно. Непонятно какое это имеет отношение к сабжу. Повторю в третий раз: Это ортогональные вещи. Прерывать можно как синхронный код, так и асинхронный. Как однопоточный код, так и многопоточный.
В том, что один из перегруженных асинхронный методов должен иметь параметр System.Threading.CancellationToken
и солнце б утром не вставало, когда бы не было меня
Re[24]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 10:51
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> ·>Так писать тоже можно. Но можно писать проще.

S> Вот именно, что Task и позволяют писать проще. IO это очень частный случай и подходит для старых проектов. Но это не киллер фича.
Вот код:
var data = socket.read();
var newData = processData(data);
socket.write(newData);

Упрости его своим Task, коли обещал.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[20]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 10:53
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> ·>Это всё понятно. Непонятно какое это имеет отношение к сабжу. Повторю в третий раз: Это ортогональные вещи. Прерывать можно как синхронный код, так и асинхронный. Как однопоточный код, так и многопоточный.

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


S>> ·>Так писать тоже можно. Но можно писать проще.

S>> Вот именно, что Task и позволяют писать проще. IO это очень частный случай и подходит для старых проектов. Но это не киллер фича.
·>Вот код:
·>
·>var data = socket.read();
·>var newData = processData(data);
·>socket.write(newData);
·>

·>Упрости его своим Task, коли обещал.
Этот код частный случай. А вот теперь мне надо запустить несколько чтений и прервать все есть один из них вызвал исключение?

https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#whenallorfirstexception
и солнце б утром не вставало, когда бы не было меня
Отредактировано 11.05.2023 11:26 Serginio1 . Предыдущая версия .
Re[21]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 11:10
Оценка:
Здравствуйте, ·, Вы писали:

S>> ·>Это всё понятно. Непонятно какое это имеет отношение к сабжу. Повторю в третий раз: Это ортогональные вещи. Прерывать можно как синхронный код, так и асинхронный. Как однопоточный код, так и многопоточный.

S>> В том, что один из перегруженных асинхронный методов должен иметь параметр System.Threading.CancellationToken
·>Из один из перегруженных синхронных методов — тоже. Ты понимаешь смысл фразы "Это ортогональные вещи"?
То . что они никак не связаны. Но CancellationToken связан с задачами! Он для них и пнридуман!
и солнце б утром не вставало, когда бы не было меня
Re[26]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 11.05.23 11:50
Оценка:
S> Этот код частный случай. А вот теперь мне надо запустить несколько чтений и прервать все есть один из них вызвал исключение?

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


Я полагаю, что для этого будет разновидность StructuredTaskScope (тут Киллер фича JDK 21 — virtual threads) в сочетании с Executors.newVirtualThreadPerTaskExecutor (тут Киллер фича JDK 21 — virtual threads)
И по аналогичной схеме можно сделать всё, что написано по твоей ссылке.
Re[22]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 11.05.23 12:13
Оценка:
S>>> ·>Это всё понятно. Непонятно какое это имеет отношение к сабжу. Повторю в третий раз: Это ортогональные вещи. Прерывать можно как синхронный код, так и асинхронный. Как однопоточный код, так и многопоточный.
S>>> В том, что один из перегруженных асинхронный методов должен иметь параметр System.Threading.CancellationToken
S>·>Из один из перегруженных синхронных методов — тоже. Ты понимаешь смысл фразы "Это ортогональные вещи"?
S> То . что они никак не связаны. Но CancellationToken связан с задачами! Он для них и пнридуман!

У меня сложилось впечатление, что в Java для cancellation (по крайней мере асинхронного IO) сейчас принято использовать Future.cancel
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html
И это аналог Task в TAP модели C#, но без async/await (решили не добавлять новые конструкции языка).
Re[27]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 13:02
Оценка:
Здравствуйте, m2user, Вы писали:

S>> Этот код частный случай. А вот теперь мне надо запустить несколько чтений и прервать все есть один из них вызвал исключение?


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


M>Я полагаю, что для этого будет разновидность StructuredTaskScope (тут Киллер фича JDK 21 — virtual threads) в сочетании с Executors.newVirtualThreadPerTaskExecutor (тут Киллер фича JDK 21 — virtual threads)

M>И по аналогичной схеме можно сделать всё, что написано по твоей ссылке.
Ну и в итоге зачем зоопарк городить?
и солнце б утром не вставало, когда бы не было меня
Re[26]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 13:02
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Упрости его своим Task, коли обещал.

S> Этот код частный случай.
Соврал ты, короче. Проще не получается.
Любой кусок кода — это частный случай.

S>А вот теперь мне надо запустить несколько чтений и прервать все есть один из них вызвал исключение?

Это никакого отношения к сабжу не имеет. Но в качестве ликбеза:

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());
}
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 11.05.2023 13:21 · . Предыдущая версия .
Re[28]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 13:04
Оценка: +1
Здравствуйте, Serginio1, Вы писали:

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

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


M>У меня сложилось впечатление, что в Java для cancellation (по крайней мере асинхронного IO) сейчас принято использовать Future.cancel

M>https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Future.html
M>И это аналог Task в TAP модели C#, но без async/await (решили не добавлять новые конструкции языка).

Фича Task что он прекрасно может работать и без async/await через события в ContinueWith
но с ними оно намного приятнее. Поэтому и в JS их тоже завезли
и солнце б утром не вставало, когда бы не было меня
Re[27]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 11.05.23 13:48
Оценка:
Здравствуйте, ·, Вы писали:
>>А думаешь откуда это появилось в дотнете? Они же слизали CompletableFuture, которое было доступно ещё лет ~10 назад, хреново как-то слизали, код — жуть. Вот более вменяемый аналог:

Ну задачи появились еще в .NET Framework 4.0 была выпущена 12 апреля 2010 года
И главная фича acync/await была продолжение yield для создания автомата
Понятно, что Таски это не дотнетовское изобретение. Но и отнюдь не явовское
и солнце б утром не вставало, когда бы не было меня
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
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Киллер фича JDK 21 - virtual threads
От: rudzuk  
Дата: 11.05.23 18:31
Оценка:
Здравствуйте, mrTwister, Вы писали:

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


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


https://riteeksrivastava.medium.com/a-complete-journey-with-goroutines-8472630c7f5c

Scheduling of Goroutines

As I have mentioned in the last paragraph, Goroutines are cooperatively scheduled. In cooperative scheduling there is no concept of scheduler time slice. In such scheduling Goroutines yield the control periodically when they are idle or logically blocked in order to run multiple Goroutines concurrently. The switch between Goroutines happen only at well defined points — when an explicit call is made to the Goruntime scheduler. And those well defined points are:

Channels send and receive operations, if those operations would block.
The Go statement, although there is no guarantee that the new Goroutine will be scheduled immediately.
Blocking syscalls like file and network operations.
After being stopped for a garbage collection cycle.

?
avalon/3.0.2
Re[5]: Киллер фича JDK 21 - virtual threads
От: rudzuk  
Дата: 11.05.23 18:33
Оценка:
Здравствуйте, rudzuk, Вы писали:

...
r> ?

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

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


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

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

А> ·>Т.е. какой-то универсальный cancellation не нужен.

А> Таймаут выбирается исходя из условий задачи (удаленность сервера в сети и т.п.).
А> Закрытие сокета не всегда годится. Что если мне нужно прервать конкретную IO операцио, а потом продолжить работу с сокетом.
Это уже как-то сложно и наворочено получается. Скажем, работает у тебя операция чтения в массив размером в 100 мегабайт. Половину вычиталось из сокета, и тут пришел сигнал на отмену. Что с этим делать? Вкачать выкачанное обратно в интернет?
Так что разумный вариант — закрывать сокет, прерывать чтение исключением. Что interrupt в сабже и делает, если я не ошибаюсь.

А> Это все плохие решения, к которым приходится прибегать, если API не оставляет других вариантов.

Если не заниматься усложнизмом, то всё ок.

А> non-blocking I/O можно прервать через Thread.interrupt, но у этого флага весьма специфическое поведение: clearance.

Согласен, что interrupt очень по-странному реализован... Но, я надесь, простительно, ибо это было сделано с первой версии...

А> Как учесть это в стороннем коде, мне не ясно.

Это как бы баги"особенности" конкретного кода. Никто не запретит "особым" образом обрабатывать CancellationToken (если вообще ты как-то умудришься его протащить внутрь сторонней либы логгирования).

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

А> При работе с IO/CPU-bound кодом надежный cancellation для меня даже более критичен, чем потенциальный расход ресурсов на тяжеловесные потоки.
Честно говоря, не очень понимаю юзкейсы этого. Зачем надо всё делать отменяемым?
Насколько часто такое надо делать? Потому что если это какие-то corner cases, там это можно реализовать вручную, а не протаскивать везде и всюду.

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

Не знаю насколько это необходимо, но это ортогонально virtual threads. Добавят, так добавят.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[34]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 11.05.23 19:05
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> ·>Отлично, ты наконец-то стал что-то подозревать. Таски это аналог Future, который в java уже очень давно. Сабж — про другое.

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

M>Т.е. не только IO, например Lock тоже поддерживаются (кроме synchronized block).

Ну под IO я прежде всего подразумевал Порты завершения ввода-вывода
https://learn.microsoft.com/ru-ru/windows/win32/fileio/i-o-completion-ports
и солнце б утром не вставало, когда бы не было меня
Re: Киллер фича JDK 21 - virtual threads
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.05.23 06:11
Оценка: 21 (1) :)
Здравствуйте, ·, Вы писали:

Очень, очень интересная штука.
Повод перечитать Fibers under the magnifying glass.

Вкратце, как я понимаю, основная проблема зелёных потоков — взаимодействие с неуправляемым кодом.
Java пытается выехать на том, что весь код — управляемый, и все блокирующие IO операции заботливо подменены под капотом на вызовы неблокирующих с последующим yield.
Если мы имеем несчастье вызвать какую-то IO библиотеку, которая написана до JDK 21, то виртуальный поток вполне успешно встанет в ожидание, сожрав поток ОС.
Но это — чисто performance issue, т.е. старый код продолжит работать так же, как он работал в старом JDK. Апгрейд на версию библиотеки, адаптированную к JDK 21, даст автоматическое улучшение масштабируемости приложения без переписывания кода.

Хуже — ситуация, когда мы вызываем какой-то неуправляемый код, который напрямую лезет в TLS средствами операционки. Приняты ли в JDK 21 какие-то меры борьбы с таким поведением?
Если нет — то приложение просто взорвётся при переходе на виртуальные потоки.

В остальном — конечно, было бы прикольно иметь возможность прозрачного использования кооперативной многозадачности без утомительного переписывания прямолинейного кода на код с async/await.
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[34]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.05.23 06:33
Оценка: +2
Здравствуйте, Serginio1, Вы писали:

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


S> Ну и какой смысл в ограниченном IO?


Ограниченный io это ваша выдумка.

>Если все равно приходится использовать таски с CancellationToken или граф тасков. Виртуальные потоки это для старого кода.


У вас очень бурная фантазия

S>В новом коде как правило все уже асинхронно и нет смысла устраивать зоопарк!


Здесь разговор про джаву — супердешовые потоки на кооперативной многозадачности.
Те это тот самый движок для асинхронности, который не требует изменения в яп.
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 07:21
Оценка:
Здравствуйте, Sinclair, Вы писали:

S> Если мы имеем несчастье вызвать какую-то IO библиотеку, которая написана до JDK 21, то виртуальный поток вполне успешно встанет в ожидание, сожрав поток ОС.

Если эта IO-библиотека использует у себя внутри JNI, тоже написанный до 21, то да, тут оно и выжрет поток.
А если она использует тот же JDK-шний io, то всё ок.

S> Но это — чисто performance issue, т.е. старый код продолжит работать так же, как он работал в старом JDK. Апгрейд на версию библиотеки, адаптированную к JDK 21, даст автоматическое улучшение масштабируемости приложения без переписывания кода.

Да. Ещё расчёт на то, что в java принято писать pure-решения. В отличие от того же c#, где на каждый чих DllImport.

S> Хуже — ситуация, когда мы вызываем какой-то неуправляемый код, который напрямую лезет в TLS средствами операционки. Приняты ли в JDK 21 какие-то меры борьбы с таким поведением?

S> Если нет — то приложение просто взорвётся при переходе на виртуальные потоки.
Да. Возможная грабля, похоже. В смысле вряд ли оно это сможет обнаружить как-то. Но ведь реальные треды никуда не уходят. Если есть такой код, который плотно взаимодействует с нативом и делает всякие странные вещи, то его можно всё ещё пускать на реальных тредах.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Киллер фича JDK 21 - virtual threads
От: Sinclair Россия https://github.com/evilguest/
Дата: 12.05.23 07:40
Оценка: +1
Здравствуйте, ·, Вы писали:
·>А если она использует тот же JDK-шний io, то всё ок.
Ну я не особый знаток джавного ландшафта; но помимо стандартного IO в виде файлов/сокетов могут быть всякие сторонние решения.
То есть понятно, что если у нас есть какой-нибудь JDBC-шный драйвер, который внутре лезет на сервер через стандартный сокетный API, то всё зазеленеет само.
А если там какой-то high performance код, который работает с сетевой карточкой в чистой юзермоде, то чудес не случится.
·>Да. Ещё расчёт на то, что в java принято писать pure-решения. В отличие от того же c#, где на каждый чих DllImport.
Я так и подумал. Получается, тут преимущество java является обратной стороной её недостатка — трудности интеграции с нативным hi-perf кодом помогают оптимизировать low-perf код.

S>> Если нет — то приложение просто взорвётся при переходе на виртуальные потоки.

·>Да. Возможная грабля, похоже. В смысле вряд ли оно это сможет обнаружить как-то. Но ведь реальные треды никуда не уходят. Если есть такой код, который плотно взаимодействует с нативом и делает всякие странные вещи, то его можно всё ещё пускать на реальных тредах.
Тут главное — понять, можно ли пускать. В джаве популярны стеки глубиной в сотни вызовов. Вполне невинный гражданский код, который вызывает что-то из pure-java пакета, может через сотню-другую вызовов упереться в какой-то JNI, да ещё и зависимым от конфигурации образом. То есть в домашних тестах всё будет летать огнём, а в проде какая-нибудь экзотическая зависимость неожиданно стрельнет .

Я не спец в low-level; поэтому не знаю — есть ли способ определить, лазил ли сделанный нами вызов натива в TLS, чтобы сделать хотя бы fail fast с внятной диагностикой (вместо чтения мусора).
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[5]: Киллер фича JDK 21 - virtual threads
От: mrTwister Россия  
Дата: 12.05.23 08:20
Оценка: +1
Здравствуйте, rudzuk, Вы писали:

R>https://riteeksrivastava.medium.com/a-complete-journey-with-goroutines-8472630c7f5c

R>

Scheduling of Goroutines

R>As I have mentioned in the last paragraph, Goroutines are cooperatively scheduled.

R>?

Так было до go 1.14 (до 20-го года). Статья от 2018 года.
лэт ми спик фром май харт
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 09:04
Оценка: 52 (2)
Здравствуйте, Sinclair, Вы писали:

S>·>А если она использует тот же JDK-шний io, то всё ок.

S>Ну я не особый знаток джавного ландшафта; но помимо стандартного IO в виде файлов/сокетов могут быть всякие сторонние решения.
S>То есть понятно, что если у нас есть какой-нибудь JDBC-шный драйвер, который внутре лезет на сервер через стандартный сокетный API, то всё зазеленеет само.
S>А если там какой-то high performance код, который работает с сетевой карточкой в чистой юзермоде, то чудес не случится.
Ну как бы да. С другой стороны, вылизанного hiperf кода не так уж и много. Тем более там скорее всего нутро будет завязано на определённые режимы операционки и железа, ну чтоб cpu affinity, irq, numa. Но это же только транспорт в приложении, один железный поток, как правило логически относительно примитивный, а потом он может выдавать это толпе виртуальных, которые запутанную бизнес-логику делают.

S>·>Да. Ещё расчёт на то, что в java принято писать pure-решения. В отличие от того же c#, где на каждый чих DllImport.

S>Я так и подумал. Получается, тут преимущество java является обратной стороной её недостатка — трудности интеграции с нативным hi-perf кодом помогают оптимизировать low-perf код.
Java упор на managed делает. А шарп пытается на двух стульях усидеть.
Впрочем, java тоже аккуратно добавляет безопасный FFM.

S>·>Да. Возможная грабля, похоже. В смысле вряд ли оно это сможет обнаружить как-то. Но ведь реальные треды никуда не уходят. Если есть такой код, который плотно взаимодействует с нативом и делает всякие странные вещи, то его можно всё ещё пускать на реальных тредах.

S>Тут главное — понять, можно ли пускать. В джаве популярны стеки глубиной в сотни вызовов. Вполне невинный гражданский код, который вызывает что-то из pure-java пакета, может через сотню-другую вызовов упереться в какой-то JNI, да ещё и зависимым от конфигурации образом. То есть в домашних тестах всё будет летать огнём, а в проде какая-нибудь экзотическая зависимость неожиданно стрельнет .
Вроде добавляют диагностику какую-то для отслеживания pinned-потоков, что будет индикацией jni-вызовов.

S>Я не спец в low-level; поэтому не знаю — есть ли способ определить, лазил ли сделанный нами вызов натива в TLS, чтобы сделать хотя бы fail fast с внятной диагностикой (вместо чтения мусора).

В смысле внутри нативного колла? Не знаю тоже, думаю от операционки зависит.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Отредактировано 15.06.2023 12:18 · . Предыдущая версия .
Re[35]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 11:16
Оценка:
Здравствуйте, Pauel, Вы писали:
S>> Ну и какой смысл в ограниченном IO?
P>Ограниченный io это ваша выдумка.
http://rsdn.org/forum/philosophy/8525873.1
Автор: m2user
Дата: 11.05.23

Это не моя выдумка. Что автор сказал, то и повторил. Все претензии к автору топика.
>>Если все равно приходится использовать таски с CancellationToken или граф тасков. Виртуальные потоки это для старого кода.

P>У вас очень бурная фантазия

Это реальная жизнь!
S>>В новом коде как правило все уже асинхронно и нет смысла устраивать зоопарк!

P>Здесь разговор про джаву — супердешовые потоки на кооперативной многозадачности.

P>Те это тот самый движок для асинхронности, который не требует изменения в яп.
Я это прекрасно понимаю. Но я обратил внимание на недостатки.
Да для старого кода это киллер фича. Для тасков я так понимаю нет acync/await
и солнце б утром не вставало, когда бы не было меня
Re[36]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 11:28
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> P>Ограниченный io это ваша выдумка.

S> http://rsdn.org/forum/philosophy/8525873.1
Автор: m2user
Дата: 11.05.23

S> Это не моя выдумка. Что автор сказал, то и повторил. Все претензии к автору топика.
Я такого не говорил. Так что претензии лишь к твоему умению читать.
Или цитату в студию.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[37]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 11:32
Оценка: :)
Здравствуйте, ·, Вы писали:

S>> P>Ограниченный io это ваша выдумка.


·>Или цитату в студию.


http://rsdn.org/forum/philosophy/8525265.1
Автор: ·
Дата: 10.05.23

http://rsdn.org/forum/philosophy/8525280.1
Автор: ·
Дата: 10.05.23
и солнце б утром не вставало, когда бы не было меня
Re[38]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 11:52
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> S>> P>Ограниченный io это ваша выдумка.

S> ·>Или цитату в студию.
S> http://rsdn.org/forum/philosophy/8525265.1
Автор: ·
Дата: 10.05.23

S> http://rsdn.org/forum/philosophy/8525280.1
Автор: ·
Дата: 10.05.23

И где там "ограниченный IO"? Ты буковки вставь, и контекст таки прочитай моих фраз.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[39]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 11:53
Оценка:
Здравствуйте, ·, Вы писали:
А где я говорил про ограниченный IO. Я говорил про IO ! Ссылки в студию!
Ограниченный IO имеллось виду, что поддерживается только IO/
На мой вопрос про соккееты ты ответил про полный IO но не добави какие eще поддерживает методы.
Я сказал, что по сравнению с TaskCompletionSource это сильно ограниченное решение!
Только и всего.
Ну в итоге вот полный список http://rsdn.org/forum/philosophy/8525873.1
Автор: m2user
Дата: 11.05.23

Там в общем смысле IO
и солнце б утром не вставало, когда бы не было меня
Отредактировано 12.05.2023 12:06 Serginio1 . Предыдущая версия . Еще …
Отредактировано 12.05.2023 11:54 Serginio1 . Предыдущая версия .
Re[40]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 12:04
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> ·>И где там "ограниченный IO"? Ты буковки вставь, и контекст таки прочитай моих фраз.

S> А где я говорил про ограниченный IO. Я говорил про IO ! Ссылки в студию!
Здесь:
Автор: Serginio1
Дата: 11.05.23

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


И здесь:
Автор: Serginio1
Дата: 11.05.23

Ну и какой смысл в ограниченном IO?

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

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


S>> ·>И где там "ограниченный IO"? Ты буковки вставь, и контекст таки прочитай моих фраз.

S>> А где я говорил про ограниченный IO. Я говорил про IO ! Ссылки в студию!
·>Здесь:
Автор: Serginio1
Дата: 11.05.23

·>

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


Я тебе давал ссылку на твои слова. Ты сказал только об IO.
Вот здесь товарищ привел все поддерживаемое http://rsdn.org/forum/philosophy/8525873.1
Автор: m2user
Дата: 11.05.23

Но и это по сути IO
·>И здесь:
Автор: Serginio1
Дата: 11.05.23

·>

Ну и какой смысл в ограниченном IO?


Ограниченный в том, что нет TaskCompletionSource. А это в реале 90% всех асинхронных методов

http://rsdn.org/forum/philosophy/8526311.1
Автор: Serginio1
Дата: 12.05.23
и солнце б утром не вставало, когда бы не было меня
Re[42]: Киллер фича JDK 21 - virtual threads
От: Gt_  
Дата: 12.05.23 12:24
Оценка:
интересный бот, но как и chatGPT совсем не держит контекст и не обучен синтаксису C#/Java, не может их различить.
Re[16]: Киллер фича JDK 21 - virtual threads
От: m2user  
Дата: 12.05.23 12:36
Оценка:
M>>Т.е. не только IO, например Lock тоже поддерживаются (кроме synchronized block).
S>Ну под IO я прежде всего подразумевал Порты завершения ввода-вывода
S>https://learn.microsoft.com/ru-ru/windows/win32/fileio/i-o-completion-ports

Мм, I/O Completion Ports используются в java non-blocking IO.
Вот пример кода:
https://github.com/frohoff/jdk8u-jdk/blob/master/src/windows/classes/sun/nio/ch/Iocp.java

Или ты какое-то другое использование I/O Completion Ports имеешь в виду?
Re[38]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.05.23 13:02
Оценка:
Здравствуйте, Serginio1, Вы писали:

S>·>Или цитату в студию.


S>http://rsdn.org/forum/philosophy/8525265.1
Автор: ·
Дата: 10.05.23

S>http://rsdn.org/forum/philosophy/8525280.1
Автор: ·
Дата: 10.05.23


Грубо говоря — по ссылкам утверждается, что весь IO поддерживается новой фичей, т.к. это наиболее сложная часть. Откуда следует, что новая фича только для ИО — не ясно, это ваша выдумка.
Re[43]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 13:05
Оценка:
Здравствуйте, Gt_, Вы писали:

Gt_> интересный бот, но как и chatGPT совсем не держит контекст и не обучен синтаксису C#/Java, не может их различить.

Старенький он уже. Вроде ему 60+ афаик.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[42]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 13:05
Оценка: +1 :)
Здравствуйте, Serginio1, Вы писали:

S> Я тебе давал ссылку на твои слова. Ты сказал только об IO.

Приведи мои слова цитатой. С контекстом. И покажи где там "только".

S> Вот здесь товарищ привел все поддерживаемое http://rsdn.org/forum/philosophy/8525873.1
Автор: m2user
Дата: 11.05.23

S> Но и это по сути IO
Thread local vars это IO?!! Там из девяти пунктов ровно два про IO.

S> ·>И здесь:
Автор: Serginio1
Дата: 11.05.23

S> ·>Ну и какой смысл в ограниченном IO?
S> Ограниченный в том, что нет TaskCompletionSource.
Ясно. Java IO ограничен тем, что в нём нет класса из c#. Невелика потеря. Или что ты сказать-то хотел?

S> А это в реале 90% всех асинхронных методов

У _тебя_ в коде 90% вызовов асинхронных, поверю. Просто другого выбора нет, вот и приходится везде это размазывать.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[36]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.05.23 13:07
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Я это прекрасно понимаю. Но я обратил внимание на недостатки.

S>Да для старого кода это киллер фича.

В первую очередь для нового — позволяет написать более продвинутый сервер для того же хттп. И в этом новом коде можно спокойно вызывать старый, и не бояться, что всё повалится.
Не нравится хттп — можете писать что угодно, ио или нет, не важно. И это будет эффективнее чем старыми приседаниями с потоками.

> Для тасков я так понимаю нет acync/await


С этой фичей нет нужды в async/await — все делается обычными вызовами функций.
Отредактировано 12.05.2023 13:09 Pauel . Предыдущая версия .
Re[17]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 13:47
Оценка:
Здравствуйте, m2user, Вы писали:

M>>>Т.е. не только IO, например Lock тоже поддерживаются (кроме synchronized block).

S>>Ну под IO я прежде всего подразумевал Порты завершения ввода-вывода
S>>https://learn.microsoft.com/ru-ru/windows/win32/fileio/i-o-completion-ports

M>Мм, I/O Completion Ports используются в java non-blocking IO.

M>Вот пример кода:
M>https://github.com/frohoff/jdk8u-jdk/blob/master/src/windows/classes/sun/nio/ch/Iocp.java

M>Или ты какое-то другое использование I/O Completion Ports имеешь в виду?

Да я их и имел ввиду. Их используют сокеты, файлы итд. То есть на уровне системы уже есть асинхронность
и солнце б утром не вставало, когда бы не было меня
Re[39]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 13:53
Оценка:
Здравствуйте, Pauel, Вы писали:

S>>·>Или цитату в студию.


S>>http://rsdn.org/forum/philosophy/8525265.1
Автор: ·
Дата: 10.05.23

S>>http://rsdn.org/forum/philosophy/8525280.1
Автор: ·
Дата: 10.05.23


P>Грубо говоря — по ссылкам утверждается, что весь IO поддерживается новой фичей, т.к. это наиболее сложная часть. Откуда следует, что новая фича только для ИО — не ясно, это ваша выдумка.

Грубо говоря нужно сказать, что IO и еще, что то. Но суть даже не в этом в .Net 90% асинхронщины это TaskCompletionSource c использованием CancellationToken
Поэтому сильно ограничен для использования в асинхронном коде, когда уже существую асинхронные аналоги
и солнце б утром не вставало, когда бы не было меня
Re[40]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.05.23 14:06
Оценка:
Здравствуйте, Serginio1, Вы писали:

S> Грубо говоря нужно сказать, что IO и еще, что то. Но суть даже не в этом в .Net 90% асинхронщины это TaskCompletionSource c использованием CancellationToken

S>Поэтому сильно ограничен для использования в асинхронном коде, когда уже существую асинхронные аналоги

Не понял, джава виртуальные треды ограничены, потому что в дотнете есть асинхронные аналоги?
Re[43]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 14:25
Оценка:
Здравствуйте, ·, Вы писали:

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


S>> Я тебе давал ссылку на твои слова. Ты сказал только об IO.

·>Приведи мои слова цитатой. С контекстом. И покажи где там "только".
То есть если ничего кроме IO не написал, значит "только"
S>> Вот здесь товарищ привел все поддерживаемое http://rsdn.org/forum/philosophy/8525873.1
Автор: m2user
Дата: 11.05.23

S>> Но и это по сути IO
·>Thread local vars это IO?!! Там из девяти пунктов ровно два про IO.
Каким боком Thread local vars если итак известно, что сохраняется весь стек. А
Thread local vars это часть стека https://habr.com/ru/articles/702814/
Там по понятием IO я имел ввиду I/O Completion Ports где система уже сама обеспечивает асинхронность.
Там единственно, что есть асинхронный wait по аналогии c SemaphoreSlim.WaitAsync

S>> ·>И здесь:
Автор: Serginio1
Дата: 11.05.23

S>> ·>Ну и какой смысл в ограниченном IO?
S>> Ограниченный в том, что нет TaskCompletionSource.
·>Ясно. Java IO ограничен тем, что в нём нет класса из c#. Невелика потеря. Или что ты сказать-то хотел?

S>> А это в реале 90% всех асинхронных методов

·>У _тебя_ в коде 90% вызовов асинхронных, поверю. Просто другого выбора нет, вот и приходится везде это размазывать.
90% используют TaskCompletionSource.
и солнце б утром не вставало, когда бы не было меня
Re[37]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 14:32
Оценка:
Здравствуйте, Pauel, Вы писали:

>> Для тасков я так понимаю нет acync/await


P>С этой фичей нет нужды в async/await — все делается обычными вызовами функций.


То есть ты не читатель? Нахрена я тут расписнаюсь про TaskCompletionSource и CancellationToken.

Параллельное программирование, итд
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern

И заметь в том же Java существуют аналоги Task Future<T> or CompletableFuture<T>
То есть их на свалку?
и солнце б утром не вставало, когда бы не было меня
Re[41]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 12.05.23 14:49
Оценка:
Здравствуйте, Pauel, Вы писали:

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


S>> Грубо говоря нужно сказать, что IO и еще, что то. Но суть даже не в этом в .Net 90% асинхронщины это TaskCompletionSource c использованием CancellationToken

S>>Поэтому сильно ограничен для использования в асинхронном коде, когда уже существую асинхронные аналоги

P>Не понял, джава виртуальные треды ограничены, потому что в дотнете есть асинхронные аналоги?


Да уж!! То есть ты такой вывод оказывается сделал. Почитай для интереса в том числе и использованием TaskCompletionSource и CancellationToken
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/implementing-the-task-based-asynchronous-pattern

Ктати про асинхронные примитивы синхронизации. vdimas их кстати критиковал
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/interop-with-other-asynchronous-patterns-and-types#tasks-and-wait-handles

Еще частая задача Наблюдение за ходом выполнения
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern#monitoring-progress
То есть текущий поток не останавливается. Он работает и дальше и проверяет очередь сообщений окна или еще чего.
И задача может продолжаться в другом потоке или в том в котором вызван если существует контекст синхронизации

Я так понимаю, что они в виртуальных потоках сделаны.
Но можно самому сделать эффективные. То есть у меня в руках намного больше инструментов для решения любых задач для асинхронного программирования.

Я очень рад за вас, что у вас появилась такая киллер фича!
и солнце б утром не вставало, когда бы не было меня
Отредактировано 12.05.2023 16:03 Serginio1 . Предыдущая версия . Еще …
Отредактировано 12.05.2023 16:02 Serginio1 . Предыдущая версия .
Отредактировано 12.05.2023 15:18 Serginio1 . Предыдущая версия .
Re[38]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 16:14
Оценка: +1 :)
Здравствуйте, Serginio1, Вы писали:

S> И заметь в том же Java существуют аналоги Task Future<T> or CompletableFuture<T>

S> То есть их на свалку?
В 99% кода — да. И они должны жить только в 1% кода, где это _действительно_ нужно по дизайну. А не потому, что ОС не умеет слишком много потоков запускать. Ведь код пишется для того, чтобы человеки его читали, а не ОС или компилятор. Код должен быть простым насколько это возможно, но не проще.
Ты же заявил, что у тебя 90% кода на асинках. Зачем?
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[44]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 12.05.23 16:26
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

S> Каким боком Thread local vars если итак известно, что сохраняется весь стек. А

S> Thread local vars это часть стека https://habr.com/ru/articles/702814/
Нет. Они не часть стека. Под них выделяется память отдельно. О чём в этой статье и явно написано: "Выделить участок памяти по указанному в заголовку адресу".
Да не важно. Вопрос-то был — причём тут IO?

S> Там по понятием IO я имел ввиду I/O Completion Ports где система уже сама обеспечивает асинхронность.

Для сабжа не системма обеспечивать асинхронность, а jdk.

S> Там единственно, что есть асинхронный wait по аналогии c SemaphoreSlim.WaitAsync

IOCP — это только про windows. Никакого отношения к сабж не имеет.

S> 90% используют TaskCompletionSource.

Соболезную.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[38]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.05.23 17:35
Оценка: :)
Здравствуйте, Serginio1, Вы писали:

>>> Для тасков я так понимаю нет acync/await


P>>С этой фичей нет нужды в async/await — все делается обычными вызовами функций.


S>То есть ты не читатель? Нахрена я тут расписнаюсь про TaskCompletionSource и CancellationToken.


Вы до сих пор не поняли, что речь не про дотнет, а про джаву?

S>Параллельное программирование, итд

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

Вся эта хрень работает и на виртуальных потоках.

S> И заметь в том же Java существуют аналоги Task Future<T> or CompletableFuture<T>

S>То есть их на свалку?

Не в курсе подробностей реализации. Возможно, что они тоже поддерживаются новыми фичами.
Re[42]: Киллер фича JDK 21 - virtual threads
От: Pauel Беларусь http://blogs.rsdn.org/ikemefula
Дата: 12.05.23 17:41
Оценка: :))
Здравствуйте, Serginio1, Вы писали:


S>>> Грубо говоря нужно сказать, что IO и еще, что то. Но суть даже не в этом в .Net 90% асинхронщины это TaskCompletionSource c использованием CancellationToken

S>>>Поэтому сильно ограничен для использования в асинхронном коде, когда уже существую асинхронные аналоги

P>>Не понял, джава виртуальные треды ограничены, потому что в дотнете есть асинхронные механизмы?


S> Да уж!! То есть ты такой вывод оказывается сделал.


Это буквально следует из ваших слов. Кто чем в джаве ограничен — не ясно. С ваших слов вроде как джава ограничена дотнетом.

По ссылкам — лично я не вижу препятствий реализовать подобное и на виртуальных потоках. Может вы внятное что скажете, что именно почему нельзя реализовать в джаве? А то у вас общие слова, туманные мысли, и ссылки на паттерны и классы в дотнете.

S>Я так понимаю, что они в виртуальных потоках сделаны.

S> Но можно самому сделать эффективные. То есть у меня в руках намного больше инструментов для решения любых задач для асинхронного программирования.

У вас, по большому счет, только async/await и отсутствие поддержки рантаймом. Все остальное более менее одинаково.
Re: Киллер фича JDK 21 - virtual threads
От: vdimas Россия  
Дата: 02.06.23 05:54
Оценка:
Здравствуйте, ·, Вы писали:

Кровь из ушей от названия.

https://en.wikipedia.org/wiki/Fiber_(computer_science)

Понимаю, понимаю...
Классам-то уже даны названия, производные от Thread? ))
Поэтому, вертимся-крутимся ужиком...
Детсад.
Re[8]: Киллер фича JDK 21 - virtual threads
От: vdimas Россия  
Дата: 02.06.23 06:35
Оценка: 22 (1)
Здравствуйте, Serginio1, Вы писали:

S>Интересно а как сосуществуют виртуальные потоки с тасками?

S>https://learn.microsoft.com/en-us/dotnet/api/system.threading.asynclocal-1?redirectedfrom=MSDN&amp;view=net-7.0

Во-первых, не "виртуальные потоки", а Fibers, они же "зеленые потоки", если управление ими осуществляется прозрачно некоей платформой/RTL/VM.

Какой двоечник придумал термин "виртуальные потоки" — это полный П. ))

Во-вторых, Fibers — это stackfull coroutines, а дотнетные таски — stackless coroutines.

С практической т.з. разница в том, что стековые корутины могут быть прерваны и продолжены на любой глубине вызова своего кода, а бесстековые могут прерываться и продолжаться только на верхнем уровне, где продолжение порой намного дороже предыдущего прерывания, т.к. необходимо осуществлять роутинг по состояниям вложенных автоматов, если логически код бесстековой корутины прерывался на вложенных своих вызовах.

Технически стековым корутинам выделяется стек и при их переключении происходит сохранение-загрузка регистров.
А бесстековая корутина — это детерминированный автомат (не обязательно конечный, но чаще конечный).

Кстате, в и-нетах разлито довольно много идиотизма насчет зеленых потоков, например:
https://habr.com/ru/articles/543158/

Грин треды решают общую проблему в программировании — вам не хочется, чтобы ваш код блокировал процессор, растрачивая ресурсы. Решается это использованием многозадачности, которая позволяет приостановить выполнение одного участка кода, запуская на выполнение другой, переключаясь между "контекстами".

Легко спутать с параллелизмом, но не делайте этого — это две совершенно разные вещи. Параллелизм — это как забрасывание проблемы вычислительными ресурсами. Грин треды позволяют работать умнее и эффективнее, эффективнее расходовать ресурсы.

У автора кукушка малость протекла, бессмысленный набор звуков. ))

Далее в статье рассуждения о вытесняющей или нет многозадачности — там тоже сплошная каша и непонимание.
И такого бреда в и-нете полно, почему-то.

"А на самом деле..." (С)
Всё проще, на самом деле.

"Обычные потоки вытесняющие" — не совсем.
Обычные треды тоже могут кооперативно передавать управление, в АПИ любой ОС есть соотв. ср-ва, например, SwitchToThread, pthread_yield.

"Зеленые потоки кооперативные" — не совсем.
Зеленый поток может быть вытеснен вместе со своим хостовым потоком уровня ОС.

Основная разница этих подходов в том, что потоки уровня ядра переключаются ядром и это дороже по двум всего причинам:
— переключение контекста текущего процесса, что дорого в ОС, работающих в защищённом режиме, т.е. с виртуальной памятью;
— ядро управляет очередью, где тусят все потоки всех процессов.

В случае зелёных/легких потоков, ситуация чуть другая:
— при их переключении не переключается контекст исполнения процессора/ядра, т.е. не переотображается виртуальная память (задержки переключения контекста именно тут);
— процесс занимается планировкой небольшой очереди легковесных потоков, в сравнении с ситуацией, где все процессы скидывали бы все свои тысячи уже нелёгких потоков в общую очередь.

Описанные трюки относятся не только к потокам, конечно, но и к таймерам, к примитивам синхронизации и т.д.
Например, дешевле иметь свою очередь таймеров уровня процесса если этих таймеров много, чтобы не засорять общую очередь таймеров уровня ядра.
Аналогично, если много семафоров.
Аналогично, если много сокетов — тогда на юзверский уровень вытаскивают из драйвера уровня ядра только сырые пакеты, а весь диспатчинг ожидающего на сокетах IO уже происходит на уровне юзверского процесса, с обыгрыванием высокоуровневых протоколов, типа TCP/UDP/IP.
Отредактировано 03.06.2023 12:19 vdimas . Предыдущая версия . Еще …
Отредактировано 02.06.2023 8:58 vdimas . Предыдущая версия .
Отредактировано 02.06.2023 6:41 vdimas . Предыдущая версия .
Отредактировано 02.06.2023 6:40 vdimas . Предыдущая версия .
Отредактировано 02.06.2023 6:39 vdimas . Предыдущая версия .
Отредактировано 02.06.2023 6:37 vdimas . Предыдущая версия .
Re[2]: Киллер фича JDK 21 - virtual threads
От: vdimas Россия  
Дата: 02.06.23 07:55
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Вкратце, как я понимаю, основная проблема зелёных потоков — взаимодействие с неуправляемым кодом.


В дотнете та же фигня, обсуждали уже при обсуждении ReaderWriterLockSlim.
Получилась ужасно неэффективная реализация ReaderWriterLockSlim, как раз ввиду того, что объект может дёргаться как обычным образом, так и через async-методы.

Не зря я сразу по выходу говорил, что async/await в дотнете не нужен, его добавили туда не от большого ума.
Ведь в дотнете сразу сделали правильно — отделили "поток" дотнета от потока ОС и сразу же объявили, что 1:1 соответствие не гарантируется.


S>Java пытается выехать на том, что весь код — управляемый, и все блокирующие IO операции заботливо подменены под капотом на вызовы неблокирующих с последующим yield.


При чём тут "управляемый"?
Это можно делать и в неуправляемом коде — как в первых версиях Windows до 3.х включительно, или еще кучи других тогдашних многозадачных сред, типа Novell NetWare.


S>Если мы имеем несчастье вызвать какую-то IO библиотеку, которая написана до JDK 21, то виртуальный поток вполне успешно встанет в ожидание, сожрав поток ОС.


Только если эта либа писана двоечником.

В Джаве отродясь рекомендовалось юзать в JNI-коде не левые мьютексы, а MonitorEnter/MonitorExit, которые в JNI даже эффективней выполняются:
https://gcc.gnu.org/onlinedocs/gcc-4.3.6/gcj/Synchronization.html


S>Но это — чисто performance issue, т.е. старый код продолжит работать так же, как он работал в старом JDK. Апгрейд на версию библиотеки, адаптированную к JDK 21, даст автоматическое улучшение масштабируемости приложения без переписывания кода.


Ничего не даст в плане IO, как ничего не дал async/await в сравнении с явной асинхронщиной на SocketAsyncEventArgs, даже хуже стало. ))
Просто эти async/await и соотв. новые методы понизили "планку входа", но не бесплатно — оно всё теперь работает заметно хуже, т.к. выше издержки.

Я ХЗ как ты упустил из виду то, что всем давно натёрло бельмо на глазу — есть фундаментальная проблема реализации зеленых потоков совместно с IO в современных ОС.

А именно — невозможно в одном АПИ ожидать готовность сокета и готовность мьютекса/семафора/события и т.д.

Например, под Windows это возможно частично — это надо привязать WSAEVENT к сокету, и такой HEVENT уже можно слушать готовность сокета через WaitForMultipleObjects вместе с семафорами и прочим, но там макс.кол-во хендлов 64, поэтому на этой основе "библиотеки широкого пользования" не пишут, из-за нулевой масштабируемости.
Плюс добавляется задержка на срабатывание HEVENT.

Который IOCP — там можно слушать сокеты, но нельзя мьютексы, семафоры.
Некоторые умельцы говорят, что слушают хендл IOCP через WaitForMultipleObjects, но фича недокументированная и ведёт себя по-разному в разных версиях Windows.

В Linux аналогично, полная задница ровно в этом же месте.
Есть костыли навроде eventfd, но они намного медленнее семафоров, плюс требуется порой переписывать почти всё в плане синхронизации, если до этого пользовались обычными примитивами синхронизации.

Поэтому, различные такие RTL языков с реализацией зеленых потоков или различные VM решают вопрос каждый в меру своей испорченности насчёт невозможности адекватного сосуществования пула потоков IO и пула потоков для зеленых потоков. Например, в дотнете это тупо два пула, и события часто передаются из пула в пул, что тормоза.

В других платформах, типа Go, Erlang — там ничего нельзя, кроме того, что дано изкаробки, что тоже не совсем адекватно в принятой в современном мире практики переиспользования уже имеющихся нейтивных библиотек на все случаи жизни. Как минимум где нужна малейшая синхронизация — их тянуть в Go и Erlang нельзя.

Собсно, поэтому эти языки никогда не выйдут из разряда "игрушечных", что в них тупо многое не работает.
Джава/дотнет в этом смысле позволяют разработчикам больше, но и цену платят дороже.
А, да, в Java NIO и NIO.2 всё по-уродски с IO-потоками, примерно как в дотнете.


S>Хуже — ситуация, когда мы вызываем какой-то неуправляемый код, который напрямую лезет в TLS средствами операционки.

S>Приняты ли в JDK 21 какие-то меры борьбы с таким поведением?

В TLS лезть можно, если знать куда, к синхронизации никаким боком.
Я тут долго медитировал, что ты хотел сказать, но решил, что это просто несвежие грибы. ))


S>Если нет — то приложение просто взорвётся при переходе на виртуальные потоки.


В нейтиве к TLS привязывают обычно данные именно потока ОС, а не "логического".
И используют для того, чтобы не заниматься синхронизацией доступа к данным и чтобы улучшать локальность, т.е. это обычно системные какие-нить вещи, типа пула объектов, аллокаторы, связанный с данным физическим потоком диспетчер легковесных потоков/задач/IO и т.д.

Иначе, во время обработки сигналов в Linux или в completion routines в Windows можно такого наобрабатывать, если прикладную логику на TLS закладывать.
Например, через completion routines можно обслужить сколько угодно сокетов в одном потоке в асинхронном режиме.
Отличие от IOCP в том, что IO-операция привязана к одному потоку, а не к пулу их.
Именно поэтому completion routines работают намного эффективней IOCP. ))
Но в этой технике хуже с балансировкой нагрузки, ес-но.


S>В остальном — конечно, было бы прикольно иметь возможность прозрачного использования кооперативной многозадачности без утомительного переписывания прямолинейного кода на код с async/await.


А ведь говорилось сразу, что хернёй маются с этими async-await, что при наличии низлежащих либ фреймворка, с полным покрытием IO, эти задачи решаются иначе.
Просто пошли сначала по лёгкому пути, дав 1-в-1 отображение АПИ ОС на либы дотнета...
А затем, вместо того, чтобы переписать некую часть фреймворка, добавили сущностей.
Породили монструозный уродский Task.
Потом еще более уродский ValueTask, где на каждый чих по 3 проверки типа объекта в бестиповом поле object _obj.
А теперь всё, поезд ушел окончательно, как теперь от этого всего отказаться? ))
Отредактировано 02.06.2023 7:59 vdimas . Предыдущая версия . Еще …
Отредактировано 02.06.2023 7:58 vdimas . Предыдущая версия .
Отредактировано 02.06.2023 7:56 vdimas . Предыдущая версия .
Re[2]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 02.06.23 09:04
Оценка:
Здравствуйте, vdimas, Вы писали:

v> Кровь из ушей от названия.


v> https://en.wikipedia.org/wiki/Fiber_(computer_science)

v> Понимаю, понимаю...
v> Классам-то уже даны названия, производные от Thread? ))
v> Поэтому, вертимся-крутимся ужиком...
v> Детсад.
Ну потому что в API получилось так, что VirtualThread это потомок Thread и там где используется второе, можно подсунуть первое. С практической т.з. что работает для тредов, так же работает и для виртуальных тредов.

Более того, есть техническая возможность вытеснять виртуальные треды и возможно это даже появится в будущем.

"You can supply your own scheduler, written in Java, and you'll be able to choose to preempt a runaway thread. Currently, this capability is not exposed, but it will be eventually."

https://news.ycombinator.com/item?id=24060888
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[3]: Киллер фича JDK 21 - virtual threads
От: vdimas Россия  
Дата: 02.06.23 12:49
Оценка:
Здравствуйте, ·, Вы писали:

·>Ну потому что в API получилось так, что VirtualThread это потомок Thread и там где используется второе, можно подсунуть первое.


По-идее, в любой VM сущность Thread заведомо должна быть "виртуальной", как это сразу декларировалось для .Net, например, что не гарантируется привязка .Net-потока к потоку ОС.
И даже если дело в наследовании, ничего не мешало назвать общепринятым словом Fiber или LightweightThread.

GreenThread не пойдёт, т.к. этот термин используется обычно там, где легковесные потоки создаются и управляются некоей подсистемой автоматически, типа как в Erlang.
Обычных потоков там нет, а которые есть — зеленые.
Если бы дело было в начале нулевых, я бы к идентификаторам не придирался, но на сейчас сленг в этой области уже более-менее устаканился. ))


·>С практической т.з. что работает для тредов, так же работает и для виртуальных тредов.


Было бы лучше, чтобы все потоки стали легковесными, без ввода новой сущности.
Иначе в каждой блокирующей операции придётся делать лишнюю проверку относительно вида потока.


·>Более того, есть техническая возможность вытеснять виртуальные треды и возможно это даже появится в будущем.

·>"You can supply your own scheduler, written in Java, and you'll be able to choose to preempt a runaway thread. Currently, this capability is not exposed, but it will be eventually."

Разумеется, stackful-корутины могут вытесняться по прерываниям, т.к. технически они мало чем отличаются от потоков уровня ОС, отличаются только владельцем-шедуллером.
Разве что при вытеснении по прерываниям теряется легковесность переключения, т.к. вызовы проходят через ядро, т.е. получается профанация.
Отредактировано 03.06.2023 8:47 vdimas . Предыдущая версия .
Re[4]: Киллер фича JDK 21 - virtual threads
От: Serginio1 СССР https://habrahabr.ru/users/serginio1/topics/
Дата: 02.06.23 16:56
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Разумеется, statefull-корутины могут вытесняться по прерываниям, т.к. технически они мало чем отличаются от потоков уровня ОС, отличаются только владельцем-шедуллером.

V>Разве что при вытеснении по прерываниям теряется легковесность переключения, т.к. вызовы проходят через ядро, т.е. получается профанация.

Вот вопрос, а чем тебе автомат (async/await продолжение yield) с пулом потоков не угодил?
Вроде все проблемы озвученные тобой там отсутствуют, не надо сохранять состояние потока, состояние сохраняется в объекте владеющим автоматом.
Причем через TaskCompletionSource и CancellationToken можно управлять выполнением группы тасков или создавая свои
https://learn.microsoft.com/ru-ru/dotnet/standard/asynchronous-programming-patterns/consuming-the-task-based-asynchronous-pattern
и солнце б утром не вставало, когда бы не было меня
Отредактировано 02.06.2023 16:56 Serginio1 . Предыдущая версия .
Re[4]: Киллер фича JDK 21 - virtual threads
От: · Великобритания  
Дата: 02.06.23 18:24
Оценка:
Здравствуйте, vdimas, Вы писали:

v> ·>Ну потому что в API получилось так, что VirtualThread это потомок Thread и там где используется второе, можно подсунуть первое.

v> По-идее, в любой VM сущность Thread заведомо должна быть "виртуальной", как это сразу декларировалось для .Net, например, что не гарантируется привязка .Net-потока к потоку ОС.
До jdk21 там тоже ничего не гарантировалось афаир. А с сабжем — явно определили два вида тредов — платформные (или ядерные) и виртуальные. Чтобы можно было выбирать в зависимости от потребностей. И, что очень важно, сохранили обратную совместимость.

v> И даже если дело в наследовании, ничего не мешало назвать общепринятым словом Fiber или LightweightThread.

Тут главное consistency с платформой jvm, а не с win32 или boost, я их не считаю законодателем моды.

v> Если бы дело было в начале нулевых, я бы к идентификаторам не придирался, но на сейчас сленг в этой области уже более-менее устаканился. ))

Так ведь это немного не те фибры, которые в других местах. Т.е. полного соответсвия ничему существующему нет, поэтому вполне разумно придумать новое название.

v> ·>С практической т.з. что работает для тредов, так же работает и для виртуальных тредов.

v> Было бы лучше, чтобы все потоки стали легковесными, без ввода новой сущности.
Если бы это был новый ЯП с нуля, то, может и можно, но тогда получится Go.
Да и иметь явно платформенные потоки тоже иногда нужно, например, чтобы быть поближе к железу, для Low Latency случаев.

v> Иначе в каждой блокирующей операции придётся делать лишнюю проверку относительно вида потока.

Это забота JDK, а не прикладных программистов.

v> Разумеется, statefull-корутины могут вытесняться по прерываниям, т.к. технически они мало чем отличаются от потоков уровня ОС, отличаются только владельцем-шедуллером.

v> Разве что при вытеснении по прерываниям теряется легковесность переключения, т.к. вызовы проходят через ядро, т.е. получается профанация.
Именно, это будут обычные платформенные потоки, бесполезно. А виртуальные потоки вытеснять можно на safepoints которые уже есть для gc.
avalon/3.0.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Киллер фича JDK 21 - virtual threads
От: tnikolai  
Дата: 12.07.23 13:10
Оценка:
Здравствуйте, ·, Вы писали:

·>В сентябре обещают зарелизить JEP 444


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

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

Кто-то тестировал производительность? Много сетевых запросов с virtual threads по сравнению обычным асинхронным кодом
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.