"Se um trabalhador quiser fazer bem o seu trabalho, ele deve primeiro afiar suas ferramentas." - Confúcio, "Os Analectos de Confúcio. Lu Linggong"
Primeira página > Programação > Como alcançar o verdadeiro paralelismo em Golang: Goroutines, Deadlocks e Channels?

Como alcançar o verdadeiro paralelismo em Golang: Goroutines, Deadlocks e Channels?

Publicado em 2024-11-09
Navegar:963

How to Achieve True Parallelism in Golang: Goroutines, Deadlocks, and Channels?

Processamento paralelo em Golang: aproveitando a simultaneidade para desempenho

Considere o código fornecido, que mostra o processamento paralelo com goroutines. No entanto, levanta questões sobre o potencial de execução simultânea e a abordagem ideal para alcançar o paralelismo.

Execução simultânea de dowork

A premissa de que dowork será executado em paralelo é não garantido. Embora as goroutines forneçam um mecanismo de simultaneidade leve, o agendador do sistema operacional determina a sequência de execução real. GOMAXPROCS, de acordo com as notas de lançamento do Go 1.5, normalmente se alinha com os núcleos disponíveis.

Abordagem sugerida: prevenção de deadlock e controle de simultaneidade

Em relação à manutenção da execução da função principal , fmt.Scanln pode não ser confiável, especialmente em ambientes de produção. Em vez disso, considere implementar um sync.WaitGroup para garantir que todas as goroutines sejam concluídas antes de sair. Além disso, para aprimorar o controle de simultaneidade e garantir a utilização adequada de recursos para tarefas paralelas, é recomendado utilizar canais de trabalho separados para cada goroutine.

Função Utilitária para Execução de Função Paralela

Para simplificar a execução de funções paralelas, pode-se aproveitar uma função utilitária existente como a seguinte:

import "sync"

// Parallelize parallelizes function calls
func Parallelize(functions ...func()) {
    var waitGroup sync.WaitGroup
    waitGroup.Add(len(functions))

    defer waitGroup.Wait()

    for _, function := range functions {
        go func(f func()) {
            defer waitGroup.Done()
            f()
        }(function)
    }
}

Aplicando esta função ao trecho de código:

func1 := func() { f(0) }
func2 := func() { f(1) }
func3 := func() { f(2) }

Parallelize(func1, func2, func3)
Tutorial mais recente Mais>

Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.

Copyright© 2022 湘ICP备2022001581号-3