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

Mary-Kate Olsen
풀어 주다: 2024-11-05 03:48:02
원래의
410명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!