Size: a a a

2020 July 21

A

Adv0cat in Rust Async
Помоему супер первая страничка!)
источник

t

this is not mrklf in Rust Async
Adv0cat
Помоему супер первая страничка!)
Ещё гайд завезли
источник

A

Adv0cat in Rust Async
this is not mrklf
Ещё гайд завезли
О, посмотрю на днях! 👍
источник
2020 July 22

YM

Yaroslav M in Rust Async
🤟
источник

K

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

V

Vetro in Rust Async
Переслано от Vetro
Есть вопрос по Токийскому селекту.

Предусловие:

Есть TCP-сервер, необходимо поддерживать соединение с клиентом, путем получения от него keepalive-хартбитов.

Если в промежутке заданного таймаута не приходит необходимая команда - дропать соединение, если же приходит - то обновлять таймаут.

Моя имплементация -

при создании хэндлера:
tokio::spawn(async move {
   let mut delay =
       tokio::time::delay_for(Duration::from_secs(timeout));

   loop {
       select! {
           _ = &mut delay => {
               timeout_tx.send(());
               break;
           }
           next = ch_rx.next() => {
               // When sender handles are dropped, next will return Ok(None)
               // So we check if next has actual value, to reset delay
               // Otherwise that means that sender was dropped (because parent struct was dropped) and so we end this task
               if next.is_some() {
                   delay = tokio::time::delay_for(Duration::from_millis(timeout));
               } else {
                   break;
               }
           }
       }
   }
});

в самом хэндлере:
loop {
   // run concurrently timeout receiver and decoder, getting messages and handling them
   select! {
       _ = &mut timeout_rx => {
           return Err(anyhow::anyhow!("Client disconnected because of timeout!"));
       }
       res = self.socket.next() => {
           if let Some(parsed) = res {
               self.handle(parsed?).await?;
           } else {
               return Err(anyhow::anyhow!("Client disconnected!"));
           }
       }
   }
}
источник

V

Vetro in Rust Async
нормально ли то - что у меня селект крутится внутри лупа? или же стоит вынести наружу селект в первом спавне, учитывая что в любом случае обе футуры будут возвращать пендинг, пока либо не обновится таймаут, либо он не истечет?
источник

D

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

V

Vetro in Rust Async
так не получится, потому что мне нужно обновлять таймаут только при определенной команде
источник

V

Vetro in Rust Async
то есть клиент может слать любые команды, но не послать CHECK, в таком случае его все равно надо дропать
источник
2020 July 23

D

Denis in Rust Async
а
источник

D

Denis in Rust Async
странно, но ладно
источник

D

Denis in Rust Async
(обычно хартбит шлют только когда обычных сообщений нет)
источник

D

Denis in Rust Async
                if next.is_some() {
                   delay = tokio::time::delay_for(Duration::from_millis(timeout));

по-моему ты безусловно delay отодвигаешь
источник

D

Denis in Rust Async
ну, независимо от того, что там в канал пришло
источник

D

Denis in Rust Async
аааааааааааааааа
источник

V

Vetro in Rust Async
ну да, потому что там ()
источник

D

Denis in Rust Async
ппц ты хитро сделал
источник

V

Vetro in Rust Async
эдакий CancellationToken
источник

V

Vetro in Rust Async
))
источник