- Este artigo discute os desafios de usar Rust em software em espaço de usuário com concorrência em grande escala.
- O modelo assíncrono do Rust foi projetado para lidar com dois conceitos centrais da computação moderna: concorrência e paralelismo.
- Paralelismo envolve executar código simultaneamente em várias CPUs.
- Concorrência envolve separar um problema, dividi-lo em partes independentes e executá-las sem considerar a ordem ou com uma ordem parcial.
- O artigo destaca as limitações de usar vários processos para concorrência devido ao alto custo da comunicação entre processos.
- Threads, que são processos que compartilham a mesma memória, são apresentadas como alternativa, mas podem introduzir problemas complexos como condições de corrida e deadlocks.
- O artigo de 1978 de Tony Hoare, "Communicating Sequential Processes", propôs o uso de filas ou canais para que threads enviem mensagens umas às outras, oferecendo várias vantagens, como isolamento semelhante ao de processos e depuração mais fácil.
- A biblioteca padrão do Rust inclui canais em
std::sync::mpsc::sync_channel.
- No entanto, para problemas que exigem alto nível de concorrência, como um servidor web conectado a dezenas de milhares de usuários, threads podem não ser suficientes.
- Para essas situações, Rust usa o modelo "async/await", no qual funções marcadas como assíncronas retornam um future ou promise sobre o qual se pode aguardar para produzir um resultado.
- Apesar de suas vantagens, Rust assíncrono traz desafios, como a necessidade de convencer o compilador de que tudo ficará bem, algo que pode ser difícil com threads brutas.
- O uso de "contagem atômica de referências", ou Arc, é sugerido como solução, mas não é uma panaceia, pois pode causar problemas semelhantes aos de um garbage collector.
- O artigo conclui sugerindo que, apesar das forças do Rust em outras áreas, ele pode não ser a ferramenta ideal para software em espaço de usuário com concorrência em grande escala.
1 comentários
Opiniões no Hacker News