Size: a a a

2021 May 10

D

Denis in Rust Async
а, ну понятно
источник

A

Apachee in Rust Async
оно
источник

D

Denis in Rust Async
смотри, ты спавнишь фьючу, и сразу же после этого у тебя программа завершается
источник

D

Denis in Rust Async
spawn же не ждёт её выполнения
источник

A

Apachee in Rust Async
а, точно, что-то забыл про это
источник

A

Apachee in Rust Async
ок, спасибо
источник

D

Denis in Rust Async
    let handle = tokio::spawn(async move {
       bot.launch().await.expect("bot failed");
   });
   handle.await;

скажем, такой вариант уже стабильно работает
источник

A

Apachee in Rust Async
я хотел дальше из канала читать, но решил затестить и не заметил, что идет выход из программы сразу
источник

D

Denis in Rust Async
бывает)
источник
2021 May 11

VC

Valeriy Chugreev in Rust Async
Добро утро, коллеги! Помоги, пожалуйста, подружить tokio и sqlx. Есть такой стрим:
let stream =
       sqlx::query("SELECT content FROM trade WHERE created_at >= $1 AND created_at < $2 ORDER BY id")
           .bind(begin)
           .bind(end)
           .fetch(&pool);

   trade_streaming(stream).await;

В trade_streaming хотелось бы его обработать:

async fn trade_streaming(mut stream: BoxStream<Result<PgRow, Error>>) -> tokio::task::JoinHandle<()> {
   tokio::spawn(async move {
       while let Some(row) = stream.try_next().await.unwrap() {
           // что-то читаем из row
       }
   })
}

Но компилятор ругается на время жизни:
error[E0726]: implicit elided lifetime not allowed here
 --> pr/src/db/reading.rs:42:38
  |
42 | async fn trade_streaming(mut stream: BoxStream<Result<PgRow, Error>>) -> tokio::task::JoinHandle<()> {
  |                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: indicate the anonymous lifetime: `BoxStream<'_, Result<PgRow, Error>>`

Попытки завернуть stream в Arc и Mutex не помогают.

Что можно сдлеать?
источник

AV

Alex Valgusnov in Rust Async
Там в help написано - BoxStream<'_, Result...
источник

VC

Valeriy Chugreev in Rust Async
И? Что дальше?)
источник

AV

Alex Valgusnov in Rust Async
После исправления ошибка сохранилась?
источник

VC

Valeriy Chugreev in Rust Async
> Alex V
Конечно, сохранилась) Если бы это было так просто... Там проблема со static временем:

error[E0759]: `stream` has an anonymous lifetime `'_` but it needs to satisfy a `'static` lifetime requirement
 --> pr/src/db/reading.rs:42:26
  |
42 | async fn trade_streaming(mut stream: BoxStream<'_, Result<PgRow, Error>>) -> tokio::task::JoinHandle<()> {
  |                          ^^^^^^^^^^  ----------------------------------- this data with an anonymous lifetime `'_`...
  |                          |
  |                          ...is captured here...
43 |     tokio::spawn(async move {
  |     ------------ ...and is required to live as long as `'static` here
источник

VC

Valeriy Chugreev in Rust Async
То есть сам BoxStream не является корректной сущностью, которую можно безопасно перемещать в tokio::spawn (как я понимаю ситуацию).
источник

VC

Valeriy Chugreev in Rust Async
Может его как-то в канал обернуть?!
источник

VC

Valeriy Chugreev in Rust Async
В принципе я нашел решение:
let conn = pool.try_acquire().unwrap();
trade_streaming(conn, date).await;

async fn trade_streaming(mut conn: PoolConnection<Postgres>, date: NaiveDate) -> tokio::task::JoinHandle<()> {
   tokio::spawn(async move {
       let begin = date.and_hms(0, 0, 0);
       let end = begin.add(Duration::days(1));

       let mut stream =
           sqlx::query("SELECT content FROM trade WHERE created_at >= $1 AND created_at < $2 ORDER BY id")
               .bind(begin)
               .bind(end)
               .fetch(&mut conn);

       while let Some(row) = stream.try_next().await.unwrap() {
           // ...
       }
   })
}
источник

VC

Valeriy Chugreev in Rust Async
То есть поместить сам поток в spawn, не идеально, конечно, но почему бы и нет.
источник

VC

Valeriy Chugreev in Rust Async
Если у кого-то есть соображения на тему как передать BoxStream в tokio::spawn, буду весьма признателен.
источник

VC

Valeriy Chugreev in Rust Async
источник