Можно писать простой код и запускать его на миллионе тредов. Никакой колбасы async, корутин и других CPS ужасов. Обычный плоский код.
Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.
·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.
А вот в ирланге preemption есть
Здравствуйте, reversecode, Вы писали:
r> ну так тоже самое что и в го
В го это специальные языковые конструкции типа go, chan, прибито гвоздями. virtual threads это обычная многопоточка — хочешь локи, хочешь латчи, блокирующие очереди, и т.п.
r> только а эрлашланге еще и на каждом атоме перешедулинг вроде как есть
Там вообще эти жуткие акторы, иммутабельные сообщения только. Взять и и тупо расшарить данные между тредами — фигушки.
Здравствуйте, σ, Вы писали: σ> ·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются. σ> А вот в ирланге preemption есть
Скрытый текст
вроде
Там с перформансом не всё радужно. И акторы... сомнительное удовольствие.
Виртуальные треды это про асинхронное выполнение простого синхронного кода, скорее.
не совсем понятно в техническом плане что там они такого сделали
если в эршланге вытесняющий атом то в яве сделали каждую инструкцию что ли
ну т.е. как в обычном cpu где ОС каждый поток может прервать в любой момент
времени разбираться нет
так что если будет инфа о технических подробностях, закидывайте сюда
рано или поздно народ конечно разберет все на кусочки в статьях и докладах
как го и его шедуллер который затянули и в котлин и в раст как минимум
ну и в эршланге он там почти такой же только сильно наговнокоден
Здравствуйте, 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), но по демкам в интернете выглядит хорошо.
R>не совсем понятно в техническом плане что там они такого сделали R>если в эршланге вытесняющий атом то в яве сделали каждую инструкцию что ли R>ну т.е. как в обычном cpu где ОС каждый поток может прервать в любой момент R>времени разбираться нет R>так что если будет инфа о технических подробностях, закидывайте сюда
В ЖЕПе написано что time sharing нет, вытеснение на блокирующихся операциях
Здравствуйте, ·, Вы писали:
·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются.
Получается, так к какому-то варианту зелёных потоков которые были в первых джавах и вернулись?
Здравствуйте, Kernan, Вы писали:
K>·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются. K>Получается, так к какому-то варианту зелёных потоков которые были в первых джавах и вернулись?
Ну как бы не совсем. Зелёные потоки — это все потоки VM работают на одном реальном потоке и всё. А тут эти треды можно шедулить как душе угодно. Это альтернатива await/asynс, actors, корутин и прочего.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, ·, Вы писали:
·>Виртуальные треды перешедулятся на реальные треды в момент всяких многопоточных действий, типа locks, yield, sleep и т.п. Если виртуальный тред будет внутри себя крутить вычислительный цикл, то он займёт реальный тред. Т.е. кооперативная многозадачность или асинк с человеческим лицом.
·>Когда в при исполнении кода виртуального треда происходил блокировка/етс — стек сохраняется в куче, и добавляется таск в шедулер на продолжение. Шедулер берёт очередной таск, восстанавливает стек и монтирует его на реальный тред. И так по кругу. ·>Сами стеки — это маленькие кусочки порядка сотни байт.
Можно короче объяснить : если взять Win 16 и добавить работу на нескольких ядрах, то оно и получится. Только там в качестве потоков были задачи.
Здравствуйте, Kernan, Вы писали:
K>·>Кооперативная многозадачность. Виртуальные треды запускаются на пуле из ОС-тредов и на блокирующих операциях перешедулятся, стеки подменяются. K>Получается, так к какому-то варианту зелёных потоков которые были в первых джавах и вернулись?
Не вернулись, а добавили. Это опциональная конструкция для использования которой нужно использовать специальное API (для запуска виртуального потока). Обычные потоки никуда не делись.
Как там эти потоки в жаве работали в те древние времена, мне самому интересно. В линуксе потоки в принципе были своеобразные тогда, не такие, как сейчас. На солярисе вроде жава умела в полноценные зелёные потоки, которые выполнялись на куче ОС потоков. На винде хз.
·>Там вообще эти жуткие акторы, иммутабельные сообщения только. Взять и и тупо расшарить данные между тредами — фигушки.
Именно это и позволяет практически неограниченную масштабируемость, а также многие другие ценные штуки вроде прямого запрета девелоперу выстрелить себе в ногу.
Но для начального освоения требуется чуть больше шевелить мозгами, что мешает популярности.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>·>Когда в при исполнении кода виртуального треда происходил блокировка/етс — стек сохраняется в куче, и добавляется таск в шедулер на продолжение. Шедулер берёт очередной таск, восстанавливает стек и монтирует его на реальный тред. И так по кругу. PD>·>Сами стеки — это маленькие кусочки порядка сотни байт. PD>Можно короче объяснить : если взять Win 16 и добавить работу на нескольких ядрах, то оно и получится. Только там в качестве потоков были задачи.
Честно говоря я не знаю как win16 работало и уж тем более внутренности. Но полагаю задачи надо хитрым образом описывать. Тут же обыкновенный плоский код плюс кучу видов многопоточных паттернов взаимодействия только из коробки — locks, cond-vars, latches, exchange, futures, concurrent collections, етс.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Здравствуйте, SkyDance, Вы писали:
SD>·>Там вообще эти жуткие акторы, иммутабельные сообщения только. Взять и и тупо расшарить данные между тредами — фигушки. SD>Именно это и позволяет практически неограниченную масштабируемость, а также многие другие ценные штуки вроде прямого запрета девелоперу выстрелить себе в ногу. SD>Но для начального освоения требуется чуть больше шевелить мозгами, что мешает популярности.
В этом и прикол, что сабж позволяет то же, но без высокого порога вхождения.
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
зеленые потоки которые вернули в яву и размазал на форк джин пуле https://blog.rockthejvm.com/ultimate-guide-to-java-virtual-threads/
как оказывается форк джоин пул явовский уже умеет ворк стилинг
а именно вокруг него и прыгали разрабы токио пытаясь его слизать с го
а потом и в котлине итд скомуниздили
в чем то, это тоже самое что сделали в расте, только в расте это стеклесс корутины
жаль не удалось нагуглить(https://github.com/openjdk/) сами изменения которые внесены в jvm и sdk
но поверхностно теперь понятно
·>В этом и прикол, что сабж позволяет то же, но без высокого порога вхождения.
Порог вхождения в Java на самом деле намного выше.
Спасает только sunk cost, то, что люди уже потратили годы (начиная со школы, или самостоятельного изучения). В Британии мне понравилось, что некоторые профессоры в их министерство образования пытаются продвинуть чуть более разнообразные программы. Чтобы у детей было понимание других вариантов, кроме императивщины и прочих лого-бейсиков. От которых, понятное дело, путь в Джаву проще, чем в функциональные языки.