-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #138 from rust-lang-ru/gitlocalize-24341
03_state_of_async_rust.md
- Loading branch information
Showing
1 changed file
with
49 additions
and
22 deletions.
There are no files selected for viewing
71 changes: 49 additions & 22 deletions
71
async-book-ru/src/01_getting_started/03_state_of_async_rust.md
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,24 +1,51 @@ | ||
# Состояние асинхронности в Rust | ||
|
||
Асинхронная экосистема Rust претерпела большие изменения с течением времени, | ||
поэтому может быть трудно понять, какие инструменты использовать, в какие библиотеки инвестировать, | ||
или какую документацию читать. Однако типаж `Future` внутри стандартной библиотеки и `async`/`await` в языке были недавно стабилизированы. | ||
Таким образом, экосистема в целом находится в процессе миграции | ||
к недавно стабилизированному API, после чего точка оттока будет значительно | ||
уменьшена. | ||
|
||
Тем не менее, сейчас экосистема всё ещё находится в стадии | ||
активной разработки и асинхронный опыт в Rust не отполирован. | ||
Многие библиотеки до сих пор используют пакет | ||
`futures` версии 0.1, а это значит, что для | ||
взаимодействия с ними разработчикам часто требуется | ||
функциональность `compat` из пакета | ||
`futures` версии 0.3. Синтаксис `async`/`await` до сих пор достаточно нов. Важные расширения | ||
синтаксиса, такие как `async fn` для методов типажей, до | ||
сих пор не реализованы, и текущие сообщения компилятора об | ||
ошибках могут быть сложны для восприятия. | ||
|
||
Это говорит о том, что Rust на пути к более эффективной и | ||
эргономичной поддержке асинхронного программирования и если | ||
вы не боитесь изменений, наслаждайтесь погружением в мир | ||
асинхронного программирования в Rust! | ||
Части асинхронного Rust поддерживаются с теми же гарантиями стабильности, что и синхронный Rust. Другие части всё ещё созревают и будут меняться со временем. С асинхронным Rust вы можете ожидать: | ||
|
||
- Выдающаяся производительность во время выполнения для типичных одновременных рабочих нагрузок. | ||
- Более частое взаимодействие с расширенными функциями языка, такими как время жизни и закрепление (pinning). | ||
- Некоторые ограничения совместимости, как между синхронизирующим и асинхронным кодом, так и между разными асинхронными средами выполнения. | ||
- Более высокая нагрузка на обслуживание из-за продолжающейся эволюции асинхронных сред выполнения и языковой поддержки. | ||
|
||
Короче говоря, асинхронный Rust более сложен в использовании и может привести к более высокой нагрузке на обслуживание, чем синхронный Rust, но взамен даёт вам лучшую в своём классе производительность. Все области асинхронного Rust постоянно улучшаются, поэтому влияние этих проблем со временем исчезнет. | ||
|
||
## Языковая и библиотечная поддержка | ||
|
||
Хотя асинхронное программирование поддерживается самим Rust, большинство асинхронных приложений зависят от функциональности, предоставляемой пакетами сообщества. Таким образом, вам нужно полагаться на сочетание языковых функций и поддержки библиотек: | ||
|
||
- Наиболее фундаментальные трейты, типы и функции, такие как трейт [`Future`](https://doc.rust-lang.org/std/future/trait.Future.html) , предоставляются стандартной библиотекой. | ||
- Синтаксис `async/await` напрямую поддерживается компилятором Rust. | ||
- Пакет Futures предоставляет множество типов [`futures`](https://docs.rs/futures/), макросов и функций. Их можно использовать в любом асинхронном приложении Rust. | ||
- Выполнение асинхронного кода, ввод-вывод и порождение задач обеспечивается «асинхронными средами выполнения», такими как Tokio и async-std. Большинство асинхронных приложений и некоторые асинхронные трейты зависят от конкретной среды выполнения. Дополнительные сведения см. в разделе [«Асинхронная экосистема»](../08_ecosystem/00_chapter.md) . | ||
|
||
Некоторые языковые функции, к которым вы могли привыкнуть в синхронном Rust, пока недоступны в асинхронном Rust. Примечательно, что Rust не позволяет объявлять асинхронные функции в трейтах. Вместо этого вам нужно использовать обходные пути для достижения того же результата, который может быть более подробным. | ||
|
||
## Компиляция и отладка | ||
|
||
По большей части ошибки компиляции и времени выполнения в асинхронном Rust работают так же, как и всегда в Rust. Есть несколько примечательных отличий: | ||
|
||
### Ошибки компиляции | ||
|
||
Ошибки компиляции в асинхронном Rust соответствуют тем же высоким стандартам, что и в синхронном Rust, но поскольку асинхронный Rust часто зависит от более сложных языковых функций, таких как время жизни и закрепление, вы можете чаще сталкиваться с этими типами ошибок. | ||
|
||
### Ошибки времени выполнения | ||
|
||
Всякий раз, когда компилятор встречает асинхронную функцию, он внутри генерирует конечный автомат. Трассировки стека в асинхронном Rust обычно содержат детали из этих конечных автоматов, а также вызовы функций из среды выполнения. Таким образом, интерпретация трассировки стека может быть немного сложнее, чем в синхронном Rust. | ||
|
||
### Новые режимы сбоев | ||
|
||
В асинхронном Rust возможны несколько новых режимов сбоев, например, если вы вызываете блокирующую функцию из асинхронного контекста или неправильно реализуете трейт `Future`. Такие ошибки могут незаметно проходить как компилятор, так и иногда даже модульные тесты. Чёткое понимание основных концепций, которое призвана дать вам эта книга, может помочь вам избежать этих ловушек. | ||
|
||
## Вопросы совместимости | ||
|
||
Асинхронный и синхронный код не всегда можно свободно комбинировать. Например, вы не можете напрямую вызвать асинхронную функцию из функции синхронизации. Синхронный и асинхронный код также склонны продвигать разные шаблоны проектирования, что может затруднить создание кода, предназначенного для разных сред. | ||
|
||
Даже асинхронный код не всегда можно свободно комбинировать. Работа некоторых крейтов зависит от конкретной асинхронной среды выполнения. Если это так, то это обычно указывается в списке зависимостей крейта. | ||
|
||
Эти проблемы с совместимостью могут ограничить ваши возможности, поэтому заранее изучите, какая асинхронная среда выполнения и какие крейты могут понадобиться вам. Как только вы освоитесь со средой выполнения, вам не придётся сильно беспокоиться о совместимости. | ||
|
||
## Характеристики производительности | ||
|
||
Производительность асинхронного Rust зависит от реализации используемой вами асинхронной среды выполнения. Несмотря на то, что среды выполнения, на которых работают асинхронные приложения Rust, относительно новые, они исключительно хорошо работают для большинства практических рабочих нагрузок. | ||
|
||
Тем не менее, большая часть асинхронной экосистемы предполагает *многопоточную* среду выполнения. Это затрудняет использование теоретических преимуществ производительности однопоточных асинхронных приложений, а именно более дешёвой синхронизации. Ещё один упускаемый из виду вариант использования — это *задачи, чувствительные к задержкам*, которые важны для драйверов, приложений с графическим интерфейсом и т. д. Такие задачи зависят от среды выполнения и/или поддержки ОС, чтобы их можно было планировать соответствующим образом. Вы можете рассчитывать на лучшую библиотечную поддержку для этих вариантов использования в будущем. |