Entenda a diferença entre concorrência e paralelismo

Na próxima semana vou fazer um post falando sobre go routines, por isso hoje vamos entender o conceito que há por trás dessas crianças.

Embora algumas pessoas usem os dois termos para descrever a mesma coisa, eles com certeza não são. Particularmente, eu sempre dizia que Go executava suas go routines em paralelo, o que faz alusão a serem executadas com paralelismo, o que é uma grande mentira já que que Go é uma linguagem que trabalha com concorrência e não paralelismo.

Mas afinal o que isso quer dizer e qual a diferença?

Concorrência é basicamente a capacidade de lidar com várias coisas de uma só vez, enquanto paralelismo é a capacidade de lidar com várias coisas ao mesmo tempo.

Se você achou que parece ser a mesma coisa, calma… vamos dar um exemplo para tentar deixar mais claro.

Imagine que você está programando. Ao finalizar aquela função lindona, você para, pega sua jarra de café, dá um gole, volta a jarra para a mesa e volta a programar na sequência. Nesse cenário você está programando e tomando café, ou seja, está fazendo várias coisas. Isso é concorrência.

Agora imagine que você está de fone ouvindo aquele som que te faz sentir o próprio Mr. Robot. Enquanto ouve esse som, você digita freneticamente em seu teclado mecânico cheio de luzes, programando uma média de 200 linhas por minuto… Nesse cenário, você está programando e ouvindo música ao mesmo tempo. Isso é paralelismo.

Dado esses exemplos do mundo real, vamos para um exemplo com o funcionamento de um navegador.

Imagine que existem dois componentes independentes em seu navegador, um responsável por gerenciar download de arquivos e outro pela renderização do programa.

Em um programa que utiliza concorrência, quando estivermos efetuando o download de um arquivo, o programa vai ficar alterando a execução desses dois componentes, para que consiga baixar um pedaço do arquivo e na sequencia renderizar essa informação no navegador.

concorrência

Agora imagine o mesmo navegador funcionando em um computador multi core, onde ele consegue fazer download e renderizar a informação ao mesmo tempo. Nesse caso o programa estaria utilizando paralelismo.

paralelismo

Embora pelas imagens utilizar paralelismo pareça ser a melhor opção, nem sempre é, pois os dois componentes precisam “conversar” entre si, para que o componente de renderização saiba o percentual ou se o download já acabou.

O custo dessa “conversa” em sistemas funcionando com concorrência é muito baixo. Já em sistemas rodando com paralelismo, esse custo é muito alto, o que pode levar o sistema a ser mais lento.

Abaixo vou deixar uma talk do Rob Pike sobre o assunto.

Deixem suas dúvidas nos comentários.

Até a próxima!


Subscreva

Fique por dentro de tudo o que acontece no mundo Go.

Deixe uma resposta