Workloads em Go

Workloads em Go

Concorrência em Go é muito poderosa e também simples de codar está foi a intensão dos engenheiros que desenvolveram Go. A resolução de muitos problemas é bem mais eficiente utilizando concorrência e este é o poder de Go, por isto, se tornou um Deus quando o assunto é concorrência em backend. Devido a isto, problemas englobados neste universo serão resolvidos com muita eficiência e o mais importante, com muito pouco recurso computacional.

Quando falamos de concorrência temos que ressaltar que existe alguns tipos de cargas de trabalhos eles serão nossa bússola para determinar nosso ponto de equilíbrio quando tivermos que resolver problemas evolvendo concorrência.

Uma thread pode fazer dois tipos de cargas de trabalhos (Workloads): CPU-Bound e o IO-Bound.

CPU-BOUND

Esta carga de trabalho nunca irá cria uma situação em que a thread pode ser colocado em estados de espera. Ele estará constantemente fazendo cálculos. Uma thread calculando pi para décima oitava potência seria limitado pela CPU. (curiosidade: Emma Haruka Iwao é uma cientista da computação japonesa e Engenheira de Desenvolvimento Cloud do Google. Em 2019, Haruka Iwao calculou o valor de pi mais preciso do mundo, que incluiu 31,4 trilhões de dígitos). 

Este tipo de carga de trabalho, trabalhos ligadas à CPU, você precisa do paralelismo para aproveitar a simultaneidade, mais Goroutines não irá ajuda-lo e não serão eficientes, podendo atrasar ainda mais as cargas de trabalho a serem executadas, isto ocorre devido ao custo de latência (o tempo gasto) de mover Goroutines dentro e fora da thread do sistema operacional

IO-BOUND

Neste tipo de carga de trabalho as threads entram em estados de espera. Um bom exemplo seria uma solicitação de acesso a um recurso pela rede ou fazer chamadas para o sistema operacional. Uma thread que precisa acessar um banco de dados, eventos de sincronização (mutex, atomic), todos estes exemplos fazem com que a thread aguarde então poderíamos dizer que são do tipo de trabalho IO-Bound. Neste tipo de carga de trabalho você não precisa de paralelismo para usar a simultaneidade um único core físico já seria suficiente para uma boa execução de várias Goroutines. As Goroutines estão entrando e saindo dos estados de espera como parte de sua carga de trabalho.

Neste tipo de carga de trabalho ter mais Goroutines do que cores físicos pode acelerar a execução porque o custo de latência de mover Goroutines dentro e fora do thread do sistema operacional não está criando um evento. Sua carga de trabalho é naturalmente interrompida e isso permite que uma Goroutine diferente aproveite o mesmo core físico ao invés de permitir que ele fique ocioso.

CONCLUSÃO

Desta forma saberemos quando usar mais cores físicos de forma paralelos ou quando iremos precisar somente utilizar concorrência com poucos cores físicos ou somente um core. Em Go os patterns que irão nos ajudar a equilibrar esta equação, existirá momentos que precisaremos de ambos os recursos de carga de trabalho. Quer aprofundar um pouco mais sobre o assunto basta clicar neste link (Simplificando a complexidade “O Inicio”) onde tem um post bem completo.


 

Entre para ver ou adicionar um comentário

Outros artigos de Jefferson Otoni Lima

  • Explorando a Inteligência Artificial Moderna

    Explorando a Inteligência Artificial Moderna

    Nosso podcast foi ao vivo Jefferson Otoni Lima & Ricardo Ferreira dois alienígenas vivos na terra falando sobre AI…

  • Getters e setters muito conhecido em “Java” é comum o seu uso em Go?

    Getters e setters muito conhecido em “Java” é comum o seu uso em Go?

    Antes de iniciarmos temos que definir alguns conceitos importantes que a pergunta nos força a refletir. Os conceitos de…

    2 comentários
  • Proxies e API Gateway: Uma Profunda Jornada através do Tempo e Código

    Proxies e API Gateway: Uma Profunda Jornada através do Tempo e Código

    Desde do inicio da era digital para web, a maneira como os sistemas se comunicam passou por várias transformações. Na…

    2 comentários
  • A little about Goroutines in Go!

    A little about Goroutines in Go!

    Goroutines instead of threads One of the main goals of the Go programming language is to make concurrency simpler…

  • Primeiros passos em Go

    Primeiros passos em Go

    Objetivo deste post é simplesmente apresentar um pouco do porque a linguagem Go surgiu e apresentar um pouco de sua…

    3 comentários
  • Go é orientado a objetos ?

    Go é orientado a objetos ?

    Fala comigo galerinha, a semana começou agitada 😂, este post é sobre Orientação Objeto na linguagem de programação Go.…

    2 comentários
  • Iniciar em Go!

    Iniciar em Go!

    As Linguagens de programação vão muito além de serem somente “conjuntos de instruções padronizadas para que um…

    1 comentário
  • No caminho para o Go 2.0

    No caminho para o Go 2.0

    Go está na versão 1.12.

    4 comentários
  • Para quem curte DigitalOcean❤️

    Para quem curte DigitalOcean❤️

    Subindo API feita em Go 😍 para K8S O Docker é uma ferramenta de containerização utilizada para fornecer às aplicações…

  • Tipos de aplicações usando Go❤️

    Tipos de aplicações usando Go❤️

    Go é uma linguagem de uso geral. A linguagem Go foi lançada em 2009 com propósito de facilitar a resolução de problemas…

    1 comentário

Outras pessoas também visualizaram

Conferir tópicos