Select

Uma operação de select espera até que qualquer uma das futures de um conjunto esteja pronta e responde ao resultado dessa future. Em JavaScript, isso é semelhante a Promise.race. Em Python, compara-se a asyncio.wait(task_set, return_when=asyncio.FIRST_COMPLETED).

Semelhante a uma instrução match, o corpo de select! tem um número de ramos, cada um da forma pattern = future => statement. Quando um future está pronto, seu valor de retorno é desestruturado pelo pattern. O statement é então executado com as variáveis resultantes. O resultado do statement se torna o resultado da macro select!.

XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Speaker Notes

This slide should take about 5 minutes.
  • Neste exemplo, temos uma corrida entre um gato e um cachorro. first_animal_to_finish_race escuta ambos os canais e escolherá o que chegar primeiro. Como o cachorro leva 50ms, ele vence contra o gato que leva 500ms.

  • Você pode usar canais oneshot neste exemplo, já que os canais devem receber apenas um send.

  • Tente adicionar um prazo para a corrida, demonstrando a seleção de diferentes tipos de futures.

  • Observe que select! descarta ramos não correspondidos, o que cancela suas futures. É mais fácil de usar quando cada execução de select! cria novas futures.

    • Uma alternativa é passar &mut future em vez da própria future, mas isso pode levar a problemas, discutidos mais adiante no slide de pinning.