Olá
Depois de fazer o curso me surgiu uma dúvida qual é a diferença entre processos assíncronos e threads, e quando é melhor usar um ou outro?
Olá
Depois de fazer o curso me surgiu uma dúvida qual é a diferença entre processos assíncronos e threads, e quando é melhor usar um ou outro?
Oi André, tudo bem?
Um computador pode possuir vários processadores. De forma simples, podemos pensar em multi-threading como uma forma de habilitar concorrência (paralelismo), aproveitando recursos de múltiplos processadores numa aplicação. Por exemplo, se uma aplicação está executando dois métodos ao mesmo tempo, isso só é possível graças ao recurso de multi-threading. Isto é, uma thread A está executando um método X, enquanto uma thread B está executando um método Y. Esse tipo de programação exige alguns cuidados, como por exemplo: o que acontece quando uma thread precisa do resultado da outra? Nesse caso é necessário implementar algum tipo de sincronização entre as threads. Outro problema que precisa ser resolvido é quando duas threads A e B estão acessando o mesmo método X ao mesmo tempo. Enquanto uma thread está modificando uma variável, outra thread lê essa mesma variável, e "atropela" a outra, provocando resultados imprevisíveis, o que deve ser resolvido com bloqueios (locks), para evitar que uma thread entre num método enquanto ele estiver sendo acessada por outra thread.
Já o assincronismo é usado para evitar que uma aplicação fique totalmente bloqueada enquanto um método está aguardando o resultado de uma requisição web, acesso a arquivo, leitura de algum outro tipo de hardware, etc. Vamos pensar numa aplicação web que utiliza JavaScript. A linguagem JavaScript usa uma única thread. Essa única thread é responsável por tudo que a aplicação faz: renderizar a página, acessar web, acessar o cache, acessar o local storage, receber entrada de dados de formulário, etc etc. Se algum desses métodos ficar "parado e esperando" algum tipo de resultado, sua aplicação ficará congelada. Para evitar esse congelamento, sempre que um método fizer uma requisição que exija uma espera, ele deve abrir mão do processamento, e assim a função JavaScript que chamou esse método retoma o controle, executando o restante da aplicação. Note que isso não é um tipo de paralelismo, e sim uma maneira que a thread única utiliza para "não perder tempo" aguardando respostas. Assim que uma requisição retorna um resultado aguardado, aí sim a thread única volta para aquele ponto do método e continua executando com aquele resultado.
Você pode pensar em uma cozinha: com multi-threading, é como se vários cozinheiros (threads) estivessem usando várias panelas e fogões (métodos), otimizando o tempo, porém correndo o risco de atrapalharem uns aos outros. Já com assincronismo, é como se a cozinha tivesse uma única cozinheira (single thread): ela vai preparando os alimentos, mas quando coloca na panela para cozinhar (chamar o método), ela não espera ficar pronto (retorno do método), ela começa a preparar o restante dos métodos. Assim ela otimiza o tempo e não fica parada no trabalho da cozinha.