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