Size: a a a

2021 February 02

С

Сергей in Rust Async
Ilya Lakhin
Там какая-то сложная ошибка смысл которой я не вполне понял, но кажется ему не нравится, что iteration не Sync
Какой тип у finish_flag? Скорее всего ты его берёшь в функцию по ссылке, когда делаешь get(). В этом случае замыкание с одолжением по ссылке не будет Sync, отсюда и ошибка. Если можешь, лучше сделать get снаружи и результат смувить внутрь замыкания
источник

IL

Ilya Lakhin in Rust Async
Сергей
Какой тип у finish_flag? Скорее всего ты его берёшь в функцию по ссылке, когда делаешь get(). В этом случае замыкание с одолжением по ссылке не будет Sync, отсюда и ошибка. Если можешь, лучше сделать get снаружи и результат смувить внутрь замыкания
Я checked_iteration затем использую в tokio::select! там можно как-то предварительно проверить условие, если я буду использовать iteration напрямую?
источник

С

Сергей in Rust Async
Ilya Lakhin
Я checked_iteration затем использую в tokio::select! там можно как-то предварительно проверить условие, если я буду использовать iteration напрямую?
Если ты продолжишь в select брать finish_flag по ссылке  так, что finish_flag будет выходить за границы футуры, то нет.  Когда ты создаёшь асинк,  у тебя код внутри него требует Sync, т.к. всё что внутри может быть обработано в другом треде.
источник

С

Сергей in Rust Async
Можешь посадить finish_flag за атомик или Arc - тогда должно заработать
источник

IL

Ilya Lakhin in Rust Async
finish_flag - это Arc<once_cell::sync::OnceCell<()>>, то есть Send+Sync
источник

IL

Ilya Lakhin in Rust Async
Arc, к слову, потому что она приходит из другой таски. Но в данном коде это локальный клон относительно tokio::select!
источник

IL

Ilya Lakhin in Rust Async
Так что finish_flag, кмк, не является проблемным местом
источник

r

red75prime in Rust Async
Ilya Lakhin
Там какая-то сложная ошибка смысл которой я не вполне понял, но кажется ему не нравится, что iteration не Sync
Какая именно ошибка? XXX doesn't implement Sync, which is required because YYYY?
источник

IL

Ilya Lakhin in Rust Async
error[E0277]: `Function` cannot be shared between threads safely
  --> src/script/sync.rs:328:13
   |
328 |             tokio::spawn(async move {
   |             ^^^^^^^^^^^^ `Function` cannot be shared between threads safely
   |
  ::: /home/eliah/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.0.2/src/task/spawn.rs:128:21
   |
128 |         T: Future + Send + 'static,
   |                     ---- required by this bound in `tokio::spawn`
   |
// и затем длинная лапша note
// ...
help: consider further restricting this bound
   |
304 |         Function: Fn(TaskReference) -> Fut + Send + 'static + Sync,
   |    


Function - это тип iteration(который изначально Function: Fn(TaskReference) -> Fut + Send + 'static)
источник

r

red75prime in Rust Async
Ilya Lakhin
error[E0277]: `Function` cannot be shared between threads safely
  --> src/script/sync.rs:328:13
   |
328 |             tokio::spawn(async move {
   |             ^^^^^^^^^^^^ `Function` cannot be shared between threads safely
   |
  ::: /home/eliah/.cargo/registry/src/github.com-1ecc6299db9ec823/tokio-1.0.2/src/task/spawn.rs:128:21
   |
128 |         T: Future + Send + 'static,
   |                     ---- required by this bound in `tokio::spawn`
   |
// и затем длинная лапша note
// ...
help: consider further restricting this bound
   |
304 |         Function: Fn(TaskReference) -> Fut + Send + 'static + Sync,
   |    


Function - это тип iteration(который изначально Function: Fn(TaskReference) -> Fut + Send + 'static)
Попробовать завернуть iteration в Arc
источник

r

red75prime in Rust Async
red75prime
Попробовать завернуть iteration в Arc
Вру. В Mutex её надо заворачивать.
источник

IL

Ilya Lakhin in Rust Async
red75prime
Попробовать завернуть iteration в Arc
А почему её нельзя просто туда move? Она же Send
источник

r

red75prime in Rust Async
Хм. Да, непонятно почему он хочет Sync.
источник

r

red75prime in Rust Async
Это должно быть где-то в note
источник

С

Сергей in Rust Async
Как вообще выглядит iteration?
источник

IL

Ilya Lakhin in Rust Async
Вообще говоря, в моём конкретном случае я наверное могу просто вынести проверку условия за пределы tokio::select!. В моем случае этого кажется будет достаточно, но мне уже стало интересно как это решить концептуально
источник

IL

Ilya Lakhin in Rust Async
Сергей
Как вообще выглядит iteration?
Это кастомный колбек, который должен вернуть Send фьюче. Пользователь может туда что угодно запихать
источник

IL

Ilya Lakhin in Rust Async
iteration вызывается в цикле
источник

IL

Ilya Lakhin in Rust Async
Я сейчас в порядке эксперимента сделал функцию Sync. Он начал ругаться, что iteration уходит в checked_iteration на предыдущей итерации цикла
источник

r

red75prime in Rust Async
Ilya Lakhin
Я сейчас в порядке эксперимента сделал функцию Sync. Он начал ругаться, что iteration уходит в checked_iteration на предыдущей итерации цикла
Это понятно. iteration перемещается в замыкание, а потом её ещё нужно переместить в async блок, что возможно только для FnOnce замыканий.
источник