Size: a a a

2020 November 22

YM

Yaro M in Rust Async
Sergey
Привет, подскажите плиз
Если у меня есть сервис и внутри него есть поле dao:

struct Service{
 dao: MyDao<La>
}

При этом чтобы вызвать дао self должен быть: &mut self

Как собственно в Futures/Tokio стримах (внутри future/async) вызывать self метод (self.some_work(i) ), который дальше вызовет метод дао (self.dao.insert) требующий мутабельности?

Такой вариант не работает 🙁


async fn some_work(&mut self, …)->hz {
 …
 .then(|i| move async {
     self.call_self_method(i).await
   }).collect().await.unwrap();
 …
}

другой async self метод :

async fn call_self_method(&mut self, I: SomeType)->hz {
 …
 self.dao.insert(i).await
}

Как собственно правильно это делать в Futures/Tokio стримах?
Привет, а на что компилятоп ругается?
источник

S

Sergey in Rust Async
Yaro M
Привет, а на что компилятоп ругается?
если просто вызвать метод self.call_self_method внутри стрима:


 .then(|i| move async {
     self.call_self_method(i).await
   }).collect().await.unwrap();
 …

cannot move out of self, a captured variable in an FnMut closure

Если сделать обернуть поле с dao Rc + Mutex, то при вызове self.call_self_method(i).await ничего не меняется
источник

YM

Yaro M in Rust Async
Sergey
если просто вызвать метод self.call_self_method внутри стрима:


 .then(|i| move async {
     self.call_self_method(i).await
   }).collect().await.unwrap();
 …

cannot move out of self, a captured variable in an FnMut closure

Если сделать обернуть поле с dao Rc + Mutex, то при вызове self.call_self_method(i).await ничего не меняется
Ну во-первых вижу move async, насколько знаю должно быть async move
Во-вторых здесь этот move не нужен, как раз компиль коворит что ты пытаешься передать владение self в кложуру
источник

S

Sergey in Rust Async
Yaro M
Ну во-первых вижу move async, насколько знаю должно быть async move
Во-вторых здесь этот move не нужен, как раз компиль коворит что ты пытаешься передать владение self в кложуру
это опечатка, упростил пример
источник

YM

Yaro M in Rust Async
Стрим же этот только до конца метода живет?
источник

S

Sergey in Rust Async
Yaro M
Стрим же этот только до конца метода живет?
да
источник

YM

Yaro M in Rust Async
Sergey
это опечатка, упростил пример
Понял, ну тогда попробуй move убрать
источник

YM

Yaro M in Rust Async
А, какой тип у i ?
источник

S

Sergey in Rust Async
Yaro M
А, какой тип у i ?
async block may outlive the current function, but it borrows i, which is owned by the current function

тип String
источник

YM

Yaro M in Rust Async
Всмысле не Copy?
источник

YM

Yaro M in Rust Async
Ага
источник

S

Sergey in Rust Async
Yaro M
Всмысле не Copy?
упростил для примера. После конвертации объекта в стринг летит такая ошибка

captured variable cannot escape FnMut closure body

returns an async block that contains a reference to a captured variable, which then escapes the closure body
источник

YM

Yaro M in Rust Async
Sergey
упростил для примера. После конвертации объекта в стринг летит такая ошибка

captured variable cannot escape FnMut closure body

returns an async block that contains a reference to a captured variable, which then escapes the closure body
Архитектурная проблема
Припекся прям стрим здесь просто циклом не обойтись? Откуда стрим берется?
источник

YM

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

YM

Yaro M in Rust Async
Нужно вынести стрим запросов из хендлера (Service)
И где-то явно читать стрим через next() и явно вызывать хендлер для i
источник

AZ

Alexander Zaitsev in Rust Async
Переслано от Alexander Zaitsev
я чот не понял. а actix, который для акторов, как вообще с async дружит?
источник

AZ

Alexander Zaitsev in Rust Async
вопрос в чём: как грамотно дергать async функции внутри актикс акторов?
источник
2020 November 23

АГ

Алексей Герасимов... in Rust Async
Alexander Zaitsev
вопрос в чём: как грамотно дергать async функции внутри актикс акторов?
видел крейт async_support, но сам не пользовался
источник

AZ

Alexander Zaitsev in Rust Async
и ещё вопрос: правда ли, что actix использует однопоточный рантайм? а следовательно и сами акторы исполняются только в одном потоке?

Интересует именно actix, не actix-web
источник

KR

Kai Ren in Rust Async
Alexander Zaitsev
и ещё вопрос: правда ли, что actix использует однопоточный рантайм? а следовательно и сами акторы исполняются только в одном потоке?

Интересует именно actix, не actix-web
И actix и actix-web работают на одном и том же actix-rt рантайме, который уже и работат вышеописанным тобой способом (n однопоточных tokio-рантаймов).

Любой актор спавнится на каком-то потоке, и после этого не уезжает за его пределы, а остаётся там же. В результате он может мутировать своё состояние без лишней синхронизации. Общение с этим актором через сообщения возможно из любого потока.
источник