... по сути async -- это просто ухудшенная версия зелёных тредов
(бедная java от них отказалась ещё в версии 1.2 :) и так и осталась на уровне C# до явления в нём async/await и Task)
-- только с плохой интеграцией в язык программирования и слабой эргономикой использования.
Однако в большинстве нормальных языков green threads поддерживаются в той или иной форме: Erlang, Go, Haskell, Julia, OCaml, PHP :) , для Python конечно есть расширения, и т.д.
А вот в Rust их нету (но есть async/await и Future), в основном потому, что у Rust нет рантайма, и для встроенной в язык асинхронщины требуется полностью другая механика компиляции + подходящий рантайм, например Tokio (однако в результате легко получить несовместимый в другими рантаймами код :).
Зелёные потоки в основном подразумевают, что компилятор будет вставлять точки выхода везде -- чтобы можно было приостановить выполнение любого потока в любой момент.
=
Короче говоря, в мэйнстриме понимание асинхронщины сводится примерно к такому: "просто сбрось это в тред и забудь о нём". Это самое наихудшее использование потоков, которое только можно себе представить :)
Добавляется сложность и накладные расходы (например, ядрам приходится постоянно кэши сбрасывать). В результате получается, что десятки тредов просто занимаются своими делами, контактируя через какой-то общий объект. Это ужасно и по использованию процессорного времени, и в целом практически всегда это признак плохого проектирования.
Рассказывал подробнее про "concurrency или параллелизм?".
P.S. Вообще, "однопоточный" Rust был бы существенно дружелюбнее и проще. Не исключено, что когда-нибудь это и случится )
Post #1185
1.21K

- 👍 36
- ✍ 18
- ❤ 7
- 🤓 1