Твой async fn на самом деле enum, а Pin нужен потому, что Rust наступил на грабли самоссылающихся структур
TL;DR. Каждый async fn в Rust компилируется в enum-стейт-машину.
Размер этой стейт-машины равен размеру самого толстого варианта, поэтому забытая через .await переменная на пару мегабайт превращается в утечку памяти, помноженную на число задач.
Pin существует, чтобы запретить перемещать такие стейт-машины после первого poll, потому что внутри них живут указатели на собственные поля. select! молча теряет данные, если использовать в нём future без cancellation safety. И executor в Tokio, при всей его магии, концептуально умещается в сотню строк.
https://uproger.com/tvoj-async-fn-na-samom-dele-enum-a-pin-nuzhen-potomu-chto-rust-nastupil-na-grabli-samossylayushhihsya-struktur/
Обсуждение 3
Обсуждение не доступно в веб-версии. Чтобы написать комментарий, перейдите в приложение Telegram.
Обсудить в Telegram