Size: a a a

2020 November 08

в🧇

вафель 🧇 in Rust Async
ура!
источник
2020 November 09

a

antuan in Rust Async
черт его знает, в какую из групп вопрос задать. рискну сюда.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=597b9e32ec0fa54e074cb64955a2a88f

не сбилдится, тут просто пример


ошибка такая:
error: future cannot be sent between threads safely
  --> examples/check.rs:5:5
   |
5   |     tokio::spawn(build_error()).await;
   |     ^^^^^^^^^^^^ future returned by `build_error` is not `Send`
   |
  ::: /home/anton/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/task/spawn.rs:127:21
   |
127 |         T: Future + Send + 'static,
   |                     ---- required by this bound in `tokio::spawn`
   |
   = help: within `tendril::tendril::NonAtomic`, the trait `std::marker::Sync` is not implemented for `std::cell::Cell<usize>`
note: future is not `Send` as this value is used across an await
  --> examples/check.rs:12:5
   |
10  |     let parsed_doc = Html::parse_document("<div></div>");
   |         ---------- has type `scraper::Html` which is not `Send`
11  |     sub_run(parsed_doc);
12  |     another_run().await;
   |     ^^^^^^^^^^^^^^^^^^^ await occurs here, with `parsed_doc` maybe used later
13  | }
   | - `parsed_doc` is later dropped here

error: aborting due to previous error; 1 warning emitted


собственно, вопросы:
1. почему maybe used later? я ж явно муваю значение внутрь другой функции
2. не должен ли помогать в этом случае руками drop(parsed_doc) перед вызовом another_run().await (с передачей до этого ссылки в sub_run, а не значения)? вообще, суть та же, как и если бы я передал значение. так что тоже странно, на мой взгляд
3. как можно победить, кроме как вызывать Html::parse_document внутри sub_run?
источник

a

antuan in Rust Async
дабы не быть голословным: вот вариант с drop'ом
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=bfd22ea02fd7be34e4d8655d8d63eef0

10  |     let parsed_doc = Html::parse_document("<div></div>");
   |         ---------- has type `scraper::Html` which is not `Send`
...
13  |     another_run().await;
   |     ^^^^^^^^^^^^^^^^^^^ await occurs here, with `parsed_doc` maybe used later
14  | }
   | - `parsed_doc` is later dropped here
источник

IT

Ilya Titkov in Rust Async
antuan
черт его знает, в какую из групп вопрос задать. рискну сюда.
https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=597b9e32ec0fa54e074cb64955a2a88f

не сбилдится, тут просто пример


ошибка такая:
error: future cannot be sent between threads safely
  --> examples/check.rs:5:5
   |
5   |     tokio::spawn(build_error()).await;
   |     ^^^^^^^^^^^^ future returned by `build_error` is not `Send`
   |
  ::: /home/anton/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-0.2.22/src/task/spawn.rs:127:21
   |
127 |         T: Future + Send + 'static,
   |                     ---- required by this bound in `tokio::spawn`
   |
   = help: within `tendril::tendril::NonAtomic`, the trait `std::marker::Sync` is not implemented for `std::cell::Cell<usize>`
note: future is not `Send` as this value is used across an await
  --> examples/check.rs:12:5
   |
10  |     let parsed_doc = Html::parse_document("<div></div>");
   |         ---------- has type `scraper::Html` which is not `Send`
11  |     sub_run(parsed_doc);
12  |     another_run().await;
   |     ^^^^^^^^^^^^^^^^^^^ await occurs here, with `parsed_doc` maybe used later
13  | }
   | - `parsed_doc` is later dropped here

error: aborting due to previous error; 1 warning emitted


собственно, вопросы:
1. почему maybe used later? я ж явно муваю значение внутрь другой функции
2. не должен ли помогать в этом случае руками drop(parsed_doc) перед вызовом another_run().await (с передачей до этого ссылки в sub_run, а не значения)? вообще, суть та же, как и если бы я передал значение. так что тоже странно, на мой взгляд
3. как можно победить, кроме как вызывать Html::parse_document внутри sub_run?
вынеси в отдельный блок код с парсингом
async fn build_error() {
   {
       let parsed_doc = Html::parse_document("<div></div>");
       sub_run(parsed_doc);
   }
   another_run().await;
}
источник

a

antuan in Rust Async
лол да, тупанул...
а почему drop руками не прокатил?
источник

IT

Ilya Titkov in Rust Async
хз, видимо компилятор не соображает, что Html не будет между .await использоваться
источник

a

antuan in Rust Async
ок. спаибо.
источник

MS

Mikola Summer Duck in Rust Async
Да, NLL почему-то не работает для асинк блоков сейчас.
источник

V

Vetro in Rust Async
Mikola Summer Duck
Да, NLL почему-то не работает для асинк блоков сейчас.
this
источник

V

Vetro in Rust Async
И уже очень очень давно))
источник

MS

Mikola Summer Duck in Rust Async
источник
2020 November 10

в🧇

вафель 🧇 in Rust Async
Mikola Summer Duck
Да, NLL почему-то не работает для асинк блоков сейчас.
nll то работает... это не совсем он, скорее просто особенности анализа генераторов
источник
2020 November 11

A

Adatan in Rust Async
Всем привет, хочу услышать совет.
Хочу засунуть в once_cell::sync::Lazy инстанс структуры(конфиг) через Box::pin, внутри которого будет поле с коннектом к БД, и его я хочу засунуть в Arc::new(), это правильное решение? (Весь проект на tokio 0.2.22)
источник

MB

Mikail Bagishov in Rust Async
Меня смущает пин
источник

MB

Mikail Bagishov in Rust Async
Lazy все равно не дает мутабельных ссылок
источник

A

Adatan in Rust Async
Mikail Bagishov
Меня смущает пин
То есть сделать так, как я хочу, можно, но можно и без pin
источник

IB

Ivan Boldyrev in Rust Async
Adatan
Всем привет, хочу услышать совет.
Хочу засунуть в once_cell::sync::Lazy инстанс структуры(конфиг) через Box::pin, внутри которого будет поле с коннектом к БД, и его я хочу засунуть в Arc::new(), это правильное решение? (Весь проект на tokio 0.2.22)
А в Arc ты хочешь засунуть Box::pin или коннект?  Полагаю, что первое.
Arc<Pin<Box<db::Connec>t>>?
источник

A

Adatan in Rust Async
Ivan Boldyrev
А в Arc ты хочешь засунуть Box::pin или коннект?  Полагаю, что первое.
Arc<Pin<Box<db::Connec>t>>?
не не не
Типо смотри
struct Ctx {
   pub cfg: Config,
   pub db: Arc<Mongo::connect>
}
источник

A

Adatan in Rust Async
вот так я хотел
источник

IB

Ivan Boldyrev in Rust Async
А зачем тогда в Pin?
источник