Size: a a a

2021 January 18

f

folex in Rust Async
Хотя нет. Всё равно не очень понятно, одинаковый ли эффект имеет context.waker.wake() и возвращение Poll::Ready. Или, может, немного разный.
источник

f

folex in Rust Async
с тз просыпания и повторного полла стрима
источник

D

Denis in Rust Async
это ортогональные вещи
источник

f

folex in Rust Async
Ну у меня вот есть выбор
if (workDone) {
 context.waker().wake()
 return Poll::Pending
}


или
if (workDone) {
 return Poll::Ready(())
}
источник

D

Denis in Rust Async
не очень понятно, как первый вариант должен работать в принципе
источник

D

Denis in Rust Async
если ты пендинг возвращаешь, то откуда пользователь будет значения получать?
источник

f

folex in Rust Async
Denis
если ты пендинг возвращаешь, то откуда пользователь будет значения получать?
ему не надо ничего получать, я ничего не возвращаю никогда. У меня просто есть loop с процессингом внутри. Процессинг инертный, т.е. его надо вот так вот поллить
источник

D

Denis in Rust Async
может тебе проще таску для этого заспавнить отдельную?
источник

f

folex in Rust Async
Вот почему я вообще делаю этот выбор

if (A.poll().is_ready()) {
 context.waker().wake()
}
if (B.poll().is_ready()) {
 context.waker().wake()
}
return Poll::Pending


vs.

if (A.poll().is_ready()) {
  return Poll::Ready(())
}
if (B.poll().is_ready()) {
 return Poll::Ready(())
}
return Poll::Pending
источник

D

Denis in Rust Async
эти два решения принципиально разные
источник

f

folex in Rust Async
в первом случае я и A и B протолкну разом, и буду иметь 1 return в функции. А во втором случае дерну сначала один, потом другой, и буду иметь несколько return-ов
источник

D

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

f

folex in Rust Async
ну да, Бэ голодать будет
источник

D

Denis in Rust Async
а зачем ты вообще это делаешь, если можно заменить на select!?
источник

f

folex in Rust Async
let a_ready = A.poll().is_ready();
let b_ready = B.poll().is_ready();

if (a_ready || b_ready) {
  return Poll::Ready(())
}
return Poll::Pending
источник

f

folex in Rust Async
Denis
а зачем ты вообще это делаешь, если можно заменить на select!?
на селект не получится, селект работает только с фьючами, на уровень выше, в async контексте. Он с Poll не работает напрямую.
источник

f

folex in Rust Async
ну, я могу ошибаться конечно
источник

D

Denis in Rust Async
так зачем теде полл вручную дёргать-то?
источник

f

folex in Rust Async
на меня это спущено сверху, libp2p
источник

f

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