Cancelamento

Descartar uma future implica que ela nunca pode ser consultada novamente. Isso Ă© chamado de cancelamento e pode ocorrer em qualquer ponto de await. Cuidado Ă© necessĂĄrio para garantir que o sistema funcione corretamente mesmo quando as futures sĂŁo canceladas. Por exemplo, nĂŁo deve travar ou perder dados.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 18 minutes.
  • O compilador nĂŁo ajuda com a segurança do cancelamento. VocĂȘ precisa ler a documentação da API e considerar qual estado sua async fn mantĂ©m.

  • Diferentemente de panic e ?, o cancelamento faz parte do fluxo de controle normal (vs tratamento de erros).

  • O exemplo perde partes da string.

    • Sempre que o ramo tick() termina primeiro, next() e seu buf sĂŁo descartados.

    • LinesReader pode ser tornado seguro para cancelamento tornando buf parte da estrutura:

      #![allow(unused)] fn main() { struct LinesReader { stream: DuplexStream, bytes: Vec<u8>, buf: [u8; 1], } impl LinesReader { fn new(stream: DuplexStream) -> Self { Self { stream, bytes: Vec::new(), buf: [0] } } async fn next(&mut self) -> io::Result<Option<String>> { // prefixe buf e bytes com self. // ... let raw = std::mem::take(&mut self.bytes); let s = String::from_utf8(raw) .map_err(|_| io::Error::new(ErrorKind::InvalidData, "nĂŁo UTF-8"))?; // ... } } }
  • Interval::tick Ă© seguro para cancelamento porque mantĂ©m o controle de se um tick foi ‘entregue’.

  • AsyncReadExt::read Ă© seguro para cancelamento porque ou retorna ou nĂŁo lĂȘ dados.

  • AsyncBufReadExt::read_line Ă© semelhante ao exemplo e nĂŁo Ă© seguro para cancelamento. Consulte sua documentação para detalhes e alternativas.