>  기사  >  백엔드 개발  >  Go에서 병렬성을 달성하는 최적의 방법은 'go f(i)'를 사용하는 것입니까, 아니면 각 고루틴에 대한 채널 및 전용 작업자와 같은 대체 방법을 찾아야 합니까?

Go에서 병렬성을 달성하는 최적의 방법은 'go f(i)'를 사용하는 것입니까, 아니면 각 고루틴에 대한 채널 및 전용 작업자와 같은 대체 방법을 찾아야 합니까?

DDD
DDD원래의
2024-11-06 04:59:02346검색

Is using `go f(i)` the optimal way to achieve parallelism in Go, or should we explore alternative methods like channels and dedicated workers for each goroutine?

Go의 병렬 처리

문제:

주어진 Go 코드 조각을 고려하세요.

<code class="go">package main

import (
    "fmt"
    "math/rand"
    "time"
)

func main() {
    for i := 0; i < 3; i++ {
        go f(i)
    }

    // prevent main from exiting immediately
    var input string
    fmt.Scanln(&input)
}

func f(n int) {
    for i := 0; i < 10; i++ {
        dowork(n, i)
        amt := time.Duration(rand.Intn(250))
        time.Sleep(time.Millisecond * amt)
    }
}

func dowork(goroutine, loopindex int) {
    // simulate work
    time.Sleep(time.Second * time.Duration(5))
    fmt.Printf("gr[%d]: i=%d\n", goroutine, loopindex)
}</code>

질문:

  1. 'dowork' 기능이 병렬로 실행된다고 가정할 수 있나요?
  2. 이것이 병렬성을 달성하는 적절한 방법인가요, 아니면 병렬화를 달성해야 할까요? 각 고루틴에 대해 채널을 사용하고 별도의 'dowork' 작업자를 사용하시겠습니까?

답변:

GOMAXPROCS 관련:

Go 1.5 릴리스 노트에 따르면:

"기본적으로 Go 프로그램은 사용 가능한 코어 수로 설정된 GOMAXPROCS로 실행됩니다. 이전 릴리스에서는 기본값이 1이었습니다."

주요 기능 종료 방지:

'main' 기능이 즉시 종료되는 것을 방지하려면 'WaitGroup' 유형, 특히 'Wait' 기능을 활용할 수 있습니다.

병렬 처리 관련:

기능 그룹의 병렬 처리를 용이하게 하기 위해 도우미 기능을 사용할 수 있습니다.

<code class="go">import "sync"

// Parallelize executes functions concurrently
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)
    }
}</code>

귀하의 경우 병렬 처리는 다음과 같이 달성할 수 있습니다.

<code class="go">func1 := func() {
    f(0)
}

func2 = func() {
    f(1)
}

func3 = func() {
    f(2)
}

Parallelize(func1, func2, func3)</code>

위 내용은 Go에서 병렬성을 달성하는 최적의 방법은 'go f(i)'를 사용하는 것입니까, 아니면 각 고루틴에 대한 채널 및 전용 작업자와 같은 대체 방법을 찾아야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.