Size: a a a

2020 August 19

m

magras in Rust Async
Подскажите, пожалуйста, правильно ли я понимаю что код

async fn foo() {
 println!("before");
 bar().await
 println!("after");
}


трансформируется компилятором во что-то вроде

enum SuspendPoint { Begin, AwaitBar }

struct FooFuture {
 suspend_point: SuspendPoint,
 // local variables that live through suspend points
 _bar: BarFuture,
}

impl Future for FooFuture {
 fn poll(self, cx) {
   match self.suspend_point {
     Begin => goto BEGIN,
     AwaitBar => goto AWAIT_BAR,
   }
 BEGIN:
   println!("before");
   self._bar = bar();
 AWAIT_BAR:
   if let Pending = self._bar.poll(cx) {
     self.suspend_point = AwaitBar;
     return Pending;
   }
   drop(self._bar);
   println!("after");
   Ready
 }
}
источник

ph

pl 🦑 hk in Rust Async
источник

m

magras in Rust Async
Это про лейаут локальных переменных в части, которую я отделил комментарием local variables that live through suspend points. Меня сейчас больше интересует как выглядит control flow.
источник

ЗZ

Захар Zaxar163 in Rust Async
Никто не знает аналога CompletableFuture (по критерую удобства) в Rust?
источник

MB

Mikail Bagishov in Rust Async
А что это такое?
источник

ЗZ

Захар Zaxar163 in Rust Async
CompletableFuture - удобная обёртка над Future
источник

ЗZ

Захар Zaxar163 in Rust Async
как бы можно там делать thenComplete(e -> {
//java code
});
источник

ЗZ

Захар Zaxar163 in Rust Async
и т.п.
источник

KR

Kai Ren in Rust Async
Захар Zaxar163
как бы можно там делать thenComplete(e -> {
//java code
});
use futures::{FutureExt as _, TryFuture as _};
источник

ЗZ

Захар Zaxar163 in Rust Async
sps
источник

¯

¯\_(ツ)_/¯ in Rust Async
как можно передать tx, rx в функцию answer? https://pastebin.com/4R17YhDM почем
источник

¯

¯\_(ツ)_/¯ in Rust Async
closure may outlive the current function, but it borrows rx, which is owned by the current function

may outlive borrowed value rx

help: to force the closure to take ownership of rx (and any other referenced variables), use the move keyword: move |cx: Cx, command: Command|
источник

¯

¯\_(ツ)_/¯ in Rust Async
я же передаю ссылку, а не сам объект. он не может уничтожиться в том замыкании
источник
2020 August 20

KK

Kirill (Cykooz) Kuzm... in Rust Async
¯\_(ツ)_/¯
я же передаю ссылку, а не сам объект. он не может уничтожиться в том замыкании
А он не про уничтожение ссылки пишет, а про то что объект может быть уничтожен раньше чем ссылка на него.
источник

KK

Kirill (Cykooz) Kuzm... in Rust Async
Думай об этом как о том, что замыкание ты возвращаешь как результат функции main.
источник

KK

Kirill (Cykooz) Kuzm... in Rust Async
Я не мастер, но могу предположить, что вероятно поможет, если ты уберёш "декоратор" tokio::main, и "руками" создашь рантайм. И если перед его созданием будут создаваться tx и rx, то они точно "переживут" рантайм токио со всем что внутри него крутится.
источник

d

diabolo in Rust Async
Kirill (Cykooz) Kuzminykh
Я не мастер, но могу предположить, что вероятно поможет, если ты уберёш "декоратор" tokio::main, и "руками" создашь рантайм. И если перед его созданием будут создаваться tx и rx, то они точно "переживут" рантайм токио со всем что внутри него крутится.
+
источник

d

diabolo in Rust Async
причём рантайм запускается легко, хоть 10
источник

IK

Ivan Kalinin in Rust Async
Всем привет. Есть вот такая странная либа - https://github.com/Rexagon/opg, она возникла из-за того что фронтам нужна актуальная опенапи дока, а всё это время она писалась ручками. Благодаря ей можно не описывать модели а описание путей занимает намного меньше места. Однако описание путей всё равно как-бы дублирует их обработчики и есть идея описывать доку дла пути прям на самом обработчике через аттрибуты. Есть ли какой-нибудь способ аттрибуты на множестве свободных функций собрать в один объект?

Типа
#[opg(POST, ("some" / "path" / MySuperParamId))]
fn route_a() -> BoxedFilter<(impl warp::Reply,)> { ... }

#[opg(GET, ("another" / "path"))]
fn route_b() -> BoxedFilter<(impl warp::Reply,)> { ... }

fn docs() -> BoxedFilter<(impl warp::Reply,)> {
   let openapi = { somehow collect meta from route_a and route_b }.to_string();
   warp::path!("swagger.yaml").and(warp::get()).map(move || openapi).boxed()
}

fn api() -> .... {
   warp::serve(route_a().or(route_b()).or(docs())).run(...).await;
}
источник
2020 August 21

A

Anton in Rust Async
товарищи есть способ запустить асинк метод внутри синка - при условии что снаружи гарантировано запущен токийский рантайм

#[tokio::main]
asycn fn main() {
   foo();
}

fn foo() {
   // bar().await;
}

async fn bar() {
}
источник