Сообщение 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# функцию придется переписать. Причем не просто её переписать, но еще и переписать все функции, которые она вызывает и так далее.
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 ничего не надо переписывать.
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 ничего не надо переписывать.