>  기사  >  백엔드 개발  >  고루틴만 사용하는 것과 비교하여 Go에서 채널과 별도의 작업자가 어떻게 병렬성을 향상시킬 수 있나요?

고루틴만 사용하는 것과 비교하여 Go에서 채널과 별도의 작업자가 어떻게 병렬성을 향상시킬 수 있나요?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-11-05 03:48:02393검색

How can channels and separate workers improve parallelism in Go compared to using goroutines alone?

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>

이 코드는 고루틴을 사용하여 f를 동시에 실행합니다. 세 번 기능합니다. dowork 함수는 5초 동안 잠을 자면서 일부 작업을 시뮬레이션합니다.

dowork 함수가 병렬로 실행될 것이라고 가정할 수 있습니까?

예, 이렇게 가정할 수 있습니다. 기본적으로 Go는 GOMAXPROCS를 사용 가능한 코어 수로 설정하여 여러 고루틴을 동시에 실행할 수 있습니다.

이것이 병렬 처리를 달성하는 올바른 방법인가요?

입니다. 병렬성을 달성하는 유효한 방법이지만 가장 효율적인 접근 방식은 아닐 수도 있습니다. 동기화 메커니즘 없이 고루틴을 사용하면 데이터 경합 및 잘못된 결과가 발생할 수 있습니다.

채널 및 별도의 dowork 작업자 사용

병렬성을 달성하기 위한 보다 구조화되고 확장 가능한 방법은 다음을 사용하는 것입니다. 채널 및 별도의 dowork 작업자. 이 접근 방식을 사용하면 각 고루틴이 고유한 공유 데이터 복사본을 갖고 메시지 전달을 통해 통신할 수 있습니다.

다음은 채널을 사용하는 예입니다.

<code class="go">var results = make(chan int) // channel to collect results

func main() {
    // spawn a worker for each goroutine
    for i := 0; i < 3; i++ {
        go worker(i)
    }

    // collect results from the worker goroutines
    for i := 0; i < 10; i++ {
        result := <-results
        fmt.Println("Received result:", result)
    }
}

func worker(n int) {
    for i := 0; i < 10; i++ {
        // perform work and send result through the channel
        res := dowork(n, i)
        results <- res
    }
}</code>

결론

Go의 병렬성은 고루틴을 사용하여 달성할 수 있습니다. 채널과 별도의 작업자를 사용하는 것은 데이터 무결성을 보장하고 성능을 향상시키는 보다 구조화되고 확장 가능한 접근 방식입니다.

위 내용은 고루틴만 사용하는 것과 비교하여 Go에서 채널과 별도의 작업자가 어떻게 병렬성을 향상시킬 수 있나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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