Обсуждение подтверждает, что async/await — не просто синтаксис, а набор глубоких дизайнерских решений, влияющих на поведение систем, и многие разработчики сталкиваются с непредсказуемостью из-за неявных семантик, особенно в JavaScript и Python.
-
Совет: По опыту @spankalee в Zena, выбор семантики async/await должен основываться на проверенных моделях, таких как Trio, и включать явное описание точек принятия решений, чтобы избежать неоднозначностей.
-
Многие участники, включая @biorach и @cpa, согласны, что анализ семантики async/await по девяти измерениям — редкий и ценный вклад, сравнимый с историческим спором о лексическом и динамическом области видимости.
-
Спор: @theamk утверждает, что тест в статье несправедлив, так как Trio позволяет как ленивое, так и жадное выполнение через n.start_soon(write_to_log) vs n.start_soon(write_to_log()), и реальные приложения используют общие nursery, а не одноразовые.
-
Спор: @crabbone считает, что запуск задачи без ожидания — неопределённое поведение, и разница в результатах между языками — следствие неправильного подхода, а не легитимных дизайнерских выборов.
-
Совет: @flossly по опыту в Kotlin-проекте отказалась от async/await, потому что он «заражает» весь стек, требуя асинхронности на всех уровнях, что приводит к дублированию библиотечных стеков и усложнению поддержки.
-
Совет: @dmix по опыту публикации JS-библиотеки обнаружил, что многие разработчики не понимают async/await, и рекомендует избегать его в базовой документации, особенно для новичков.
-
Участники @jcelerier и @alilleybrinker отмечают, что C++ позволяет настраивать все девять измерений, что делает его гибким, но превращает каждую библиотеку в DSL, что усложняет обучение и совместимость.
-
Совет: @deepsun предлагает расширить анализ Go (goroutines) и Kotlin (coroutines), так как их модели корутин кардинально отличаются от stackless async/await и являются ключевыми в современных системах.
-
@slopinthebag и @perrygeo подтверждают, что async/await проще для понимания, чем потоки или goroutines, особенно для тех, кто начинал с него, не имея опыта с многопоточностью.
-
Совет: @galaxyLogic описывает практическую боль: изменение синхронной функции на асинхронную требует переписывания всей цепочки вызовов, что делает миграцию к async/await дорогостоящей и рискованной.
-
Совет: @mitxela критикует статью за чрезмерное дробление измерений, утверждая, что автономность задачи уже подразумевает её поведение после отмены, и выделение этого как отдельного измерения — избыточно.
-
@biorach и @moralestapia отмечают, что до этой работы многие разработчики интуитивно чувствовали неоднозначность async/await, но не могли формализовать её — теперь есть язык для обсуждения этих проблем.