Информация об изменениях

Сообщение Re[6]: Можно ли избавиться от async|await? от 13.12.2025 20:02

Изменено 13.12.2025 20:06 mrTwister

Re[6]: Можно ли избавиться от async|await?
Здравствуйте, novitk, Вы писали:

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


T>>Только в C# и пр. есть два вида "ждать": можно ждать синхронно, а можно ждать асинхронно. Причем синхронное ожидание внешне никак не отличается от "не ждать"...., но и очень часто приводит к ошибкам, когда внутри асинхронной функции случайно вызвали сихронное ожидание.

N>Как это не отличается и какие нафиг ошибки?! Там тип результата разный (Task<T> vs T). Компилятор сразу по рукам.

Декларация функций разная, но вызов при этом выглядит одинаково: foo()


T>>Все максимально explicit:

T>>foo() — ждем
T>>go foo() — не ждем
T>>

T>>Все, больше вариантов нет

N>Речь об explicit в описание функции, а не в вызове. В обеих языках функцию из "ждем" в "не ждем" надо переписывать. Можно даже сказать, что в C# ee переписывать проще, так как каналы это лишние церемонии и в 99% случаев сингулярного результата достаточно.

В go ничего переписывать не надо, функция всегда выглядит одинаково. Если клиенту почему-то надо запускать функцию в горутине, он сам ее и запускает. Функции все равно где ее запускает, она асинхронная с самого начала. А вот в C# функцию придется переписать. Причем не просто её переписать, но еще и переписать все функции, которые она вызывает и так далее.
Re[6]: Можно ли избавиться от async|await?
Здравствуйте, novitk, Вы писали:

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


T>>Только в C# и пр. есть два вида "ждать": можно ждать синхронно, а можно ждать асинхронно. Причем синхронное ожидание внешне никак не отличается от "не ждать"...., но и очень часто приводит к ошибкам, когда внутри асинхронной функции случайно вызвали сихронное ожидание.

N>Как это не отличается и какие нафиг ошибки?! Там тип результата разный (Task<T> vs T). Компилятор сразу по рукам.

Декларация функций разная, но вызов при этом выглядит одинаково: foo()


T>>Все максимально explicit:

T>>foo() — ждем
T>>go foo() — не ждем
T>>

T>>Все, больше вариантов нет

N>Речь об explicit в описание функции, а не в вызове. В обеих языках функцию из "ждем" в "не ждем" надо переписывать. Можно даже сказать, что в C# ee переписывать проще, так как каналы это лишние церемонии и в 99% случаев сингулярного результата достаточно.

В go ничего переписывать не надо, функция всегда выглядит одинаково. Если клиенту почему-то надо запускать функцию в горутине, он сам ее и запускает. Функции все равно где ее запускает, она асинхронная с самого начала. А вот в C# функцию придется переписать. Причем не просто её переписать, но еще и переписать все функции, которые она вызывает и так далее. Если есть цепочка вызовов Foo->Bar->Baz->ReadFile, и понадобилась асинхронная версия Foo, то придется переписать все функции из этой цепочки вызовов: AsyncFoo->AsyncBar->AsyncBaz->AsyncReadFile. В go ничего не надо переписывать.