Introdução a concorrência em Go

Uma das funcionalidades mais legais de Go é a facilidade de se utilizar concorrência. A linguagem nos fornece as chamadas goroutines que são lighweight threads gerenciadas pelo própio runtime do Go. Concorrência nos permite rodar diversas funções ao me…


This content originally appeared on DEV Community 👩‍💻👨‍💻 and was authored by Matheus Mina

Uma das funcionalidades mais legais de Go é a facilidade de se utilizar concorrência. A linguagem nos fornece as chamadas goroutines que são lighweight threads gerenciadas pelo própio runtime do Go. Concorrência nos permite rodar diversas funções ao mesmo tempo. Isso é extremamente útil caso você queira melhorar a performance de sua aplicação.

Para utilizar essa funcionalidade, basta colocar a palavra-chave go antes de qualquer função e ela automaticamente vai estar rodando de forma concorrente. Para ficar mais fácil de entender, vamos ver um pouco de código. Aqui está implementado o SleepSort, é um algoritmo de ordenação que utiliza um sleep para poder colocar cada elemento no seu lugar.

package main

import (
    "fmt"
    "time"
)

func main() {
    arr := []int{3, 1, 5, 6, 9, 2, 0}

    fmt.Println("Sorting", arr)
    for _, v := range arr {
        go Sort(v)
    }
}

func Sort(x int) {
    time.Sleep(time.Duration(x) * time.Second)
    fmt.Printf("%d ", x)
}

Nesse código, temos a função sort que dorme por x segundos e imprime o valor desejado. Assim, ao final da execução de todo mundo, vamos ter impresso o array na ordem certa, correto? Infelizmente a resposta é: não!

Resposta inicial do código

Como a função roda de forma concorrente ao processo principal, só vemos na saída o que este processo retorna. Uma maneira de solucionar este problema é fazermos os processos concorrentes se comunicarem de alguma forma com o processo principal. Para isso, a linguagem nos fornece o conceito de channel. Podemos entender este conceito como um canal, ou conduinte, responsável por enviar dados entre os processos. Vamos atualizar nosso código então para utilizar channels.

package main

import (
    "fmt"
    "time"
)

func main() {
    arr := []int{3, 1, 5, 6, 9, 2, 0}
    c := make(chan int)

    fmt.Println("Sorting", arr)
    for _, v := range arr {
        go sort(v, c)
    }

    fmt.Println("Sorted:")
    for range arr {
        x := <-c
        fmt.Printf("%d ", x)
    }
}

func sort(x int, c chan int) {
    time.Sleep(time.Duration(x) * time.Second)
    c <- x
}

E finalmente temos como resposta:

Resposta após utilizarmos channels

Como podemos notar, existe um operador especial para os channels que é o <-. Para entender como ele funciona, é só pensar que o dado vai seguir o sentido da seta. Por exemplo, dentro da função sort o dado é enviado através do canal usando c <- x e na função principal recebemos um valor do canal e atribuímos em uma nova variável utilizando x := <-c.

Também é importante dizer que a assinatura da função sort foi alterada para receber um chan. Esse chan então é inicializado na função principal e passado para as goroutines.

Como podemos ver, começar a utilizar concorrência em Go é simples. A linguagem também suporta opções mais avançadas, mas isso fica para um próximo blog post. Se curtiu o assunto, você também pode me encontrar no Twitter, Github ou LinkedIn. Você também pode achar esse texto em Inglês.


This content originally appeared on DEV Community 👩‍💻👨‍💻 and was authored by Matheus Mina


Print Share Comment Cite Upload Translate Updates
APA

Matheus Mina | Sciencx (2022-11-01T13:03:19+00:00) Introdução a concorrência em Go. Retrieved from https://www.scien.cx/2022/11/01/introducao-a-concorrencia-em-go/

MLA
" » Introdução a concorrência em Go." Matheus Mina | Sciencx - Tuesday November 1, 2022, https://www.scien.cx/2022/11/01/introducao-a-concorrencia-em-go/
HARVARD
Matheus Mina | Sciencx Tuesday November 1, 2022 » Introdução a concorrência em Go., viewed ,<https://www.scien.cx/2022/11/01/introducao-a-concorrencia-em-go/>
VANCOUVER
Matheus Mina | Sciencx - » Introdução a concorrência em Go. [Internet]. [Accessed ]. Available from: https://www.scien.cx/2022/11/01/introducao-a-concorrencia-em-go/
CHICAGO
" » Introdução a concorrência em Go." Matheus Mina | Sciencx - Accessed . https://www.scien.cx/2022/11/01/introducao-a-concorrencia-em-go/
IEEE
" » Introdução a concorrência em Go." Matheus Mina | Sciencx [Online]. Available: https://www.scien.cx/2022/11/01/introducao-a-concorrencia-em-go/. [Accessed: ]
rf:citation
» Introdução a concorrência em Go | Matheus Mina | Sciencx | https://www.scien.cx/2022/11/01/introducao-a-concorrencia-em-go/ |

Please log in to upload a file.




There are no updates yet.
Click the Upload button above to add an update.

You must be logged in to translate posts. Please log in or register.