async/await - разное поведение программыИсследователи Brown University сравнили семь реализаций асинхронности: JavaScript, C#, Swift, Tokio, Smol, Asyncio и Trio. Ни одна пара не показала полностью одинаковую семантику.
В простом 12-строчном примере функция запускает фоновую запись в лог и завершает работу. Результат зависит от среды:
* JavaScript:
AC* C#:
C* Tokio:
ACB* Swift:
AC* Trio:
ABCАвторы выделили девять параметров, влияющих на выполнение: ленивость, гарантии приостановки, время жизни задачи, сила ссылок, уничтожение, передача исключений, обработка отмены, её направление и сохранение задачи.
Особенности Rust:
* вызов
async fn только создаёт Future - выполнение начинается после опроса через runtime* задача не получает внутренний сигнал отмены, как в Swift или Python с Trio
Одинаковый синтаксис скрывает разные правила запуска, отмены и завершения задач.
http://cel.cs.brown.edu/blog/design-space-async-await
