Entendendo go routines

Go routines é o jeito no go de executar código de forma concorrente com outras funcs. Para executar um método de forma concorrente, basta utilizar a palavra chave go antes da sua func. Para exemplificar essa questão, vamos pensar na seguinte situação: sua app precisa enviar um email, mas como o envio de email não é uma operação tão rápida, você não quer deixar o seu usuário esperando para poder continuar utilizando o seu app. Para isso, vamos pedir para uma go routine enviar o nosso email e continuar com a execução do email.

Primeiramente vamos fazer da forma clássica, um programa linear:

 

package main

import (
    "fmt"
    "net/smtp"
)

func main() {
    fmt.Println("insira a mensagem do email")
    var m string
    fmt.Scanln(&m)
    
    auth := smtp.PlainAuth("", "user", "password", "smtp.gmail.com")
    smtp.SendMail(
        "smtp.gmail.com:587",
        auth,
        "email@gmail.com",
        []string{"to@gmail.com"},
        []byte(m),
    )

    fmt.Printf("mail %s sent", m)
}

Note que após inserir a mensagem, temos que esperar alguns instantes até que nos seja avisado que o email foi enviado. Para resolver este problema, vamos extrair o código de envio de email para uma função.

package main

import (
    "fmt"
    "net/smtp"
)

func enviarEmail(m string) {
    auth := smtp.PlainAuth("",
                           "mail",
                           "senha",
                           "smtp.gmail.com",
    )

    smtp.SendMail("smtp.gmail.com:587",
                  auth,
                  "mail@gmail.com",
                  []string{"mail@gmail.com"},
                  []byte(m),
    )
}

func main() {
    fmt.Println("insira a mensagem do email")
    var m string
    fmt.Scanln(&m)

    emviarEmail((m)
    fmt.Printf("mail %s sent", m)
}

Note que por hora não mudou nada, apenas passamos a enviar o email de uma func. Para deixarmos o email ser enviado de forma concorrente, vamos agora chamar a func enviarEmail com go na frente.

package main

import (
    "fmt"
    "net/smtp"
)

func enviarEmail(m string) {
    auth := smtp.PlainAuth("",
                           "mail",
                           "senha",
                           "smtp.gmail.com",
    )

    smtp.SendMail("smtp.gmail.com:587",
                  auth,
                  "mail@gmail.com",
                  []string{"mail@gmail.com"},
                  []byte(m),
    )
    fmt.Printf("email %s enviado com sucesso", m)
}

func main() {
    fmt.Println("insira a mensagem do email")
    var m string
    fmt.Scanln(&m)
        
    go enviarEmail(m)

    fmt.Println("foi solicitado o envio do email, mas continuaremos com nosso programa ;)")

    fmt.Scanln(&m)
}

Se quiser, eu criei um gist com este exemplo: goroutine_example

Por hoje é só 😀

Anúncios

Um comentário sobre “Entendendo go routines

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s