Здравствуйте, Serginio1, Вы писали:
S>·>Product coreApi(long id) {
S>·>async Product coreApi(long id, CancellationToken token = default) {
S>·>ИЧСХ, вот такой простой линейный код составляет 99% типичного приложения. Параллелизация обычно где-то на уровне фреймворка (ну там входящие HTTP-запросы какие-нибудь).
S>Ошибаешься. Их куча я тебе уже приводил примеры асинхронной очереди через TaskCompletionSource.
S>А он используется в различных алгоритмах очень часто.
Ты приводил ненужный код, который ничего ценного
с т.з. бизнеса не делает. Тебе просто не нужна асинхронная очередь, если у тебя нет асинхронного кода.
Я тебе предложил сравнить код бизнес-логики выше, но ты проигнорировал.
S>>>На самом деле Task были придуманы еще в 12 году. В Яве виртуальные потоки появились значительно позже, а StructuredTaskScope так вообще еще превью.
S>·>ДЕСЯТЫЙ РАЗ ПОВТОРЯЮ! Task — это аналог CompletableFuture. И появилось оно в 13 году что-ли. Заметь в моём коде вообще нигде Task/CompletableFuture нет. Они просто не нужны.
S>Где же await в Яве. Аналог асинхронного программирования в первых версиях фреймворка IAsyncResult
S> async/await это по сути реализация IEnumerable yield для задач.
async/await это по сути сахар, чтобы коллбеки получше выглядели. Без него можно писать как-то так:
CompletableFuture<Product> coreApi(long id) {
return readFromFile(id, token)
.thenCompose(d1 -> queryDb(id, d1 + 42)
.thenCompose(d2 -> {
synchronized(lock) {
return downloadFromRestApi(id, d2, d1)
.thenApply(d3 -> new Product(d3, d1));
}
}));
}
Жуть полная. Поэтому и начали появляться на свет всякие reactive фреймворки. Но с виртуальными тредами это просто не нужно.
S>Кстати Linq в Java появился?
Нет.
S>>>Виртуальные потоки однозначно хороши для синхронного кода. Но что касается асинхронного, то тут нет однозначности.
S>·>Они делают асинхронный код ненужным.
S> Несогласен!
Твоё право, но факт отстаётся фактом.