>백엔드 개발 >Golang >Golang 코루틴 및 동시성 모델

Golang 코루틴 및 동시성 모델

WBOY
WBOY원래의
2024-04-15 14:21:01407검색

Go의 코루틴은 동일한 프로세스에서 여러 작업을 실행할 수 있는 가벼운 동시성 메커니즘입니다. 프로세스 메모리 공간을 공유하고 채널을 통해 통신할 수 있습니다. 또한 이 문서에서는 go 키워드를 사용한 코루틴 생성에 대해 설명합니다. 채널은 make 함수로 생성되며 코루틴 간에 값을 전달하는 데 사용할 수 있습니다. 실제 사례에서는 코루틴을 사용하여 병렬 컴퓨팅을 구현하고 8개의 코루틴을 통해 100,000개의 소수를 계산하는 방법을 보여줍니다.

Golang 코루틴 및 동시성 모델

Go 코루틴 및 동시성 모델

소개

코루틴은 동일한 프로세스에서 여러 개의 독립적인 작업을 실행할 수 있도록 하는 Go 언어의 경량 동시성 메커니즘입니다. 이 기사에서는 Go의 코루틴과 동시성 모델을 살펴보고 실제 사례를 제공합니다.

Coroutines

Coroutine은 Go 언어의 동시 실행 단위로 스레드와 유사하지만 더 가볍습니다. 코루틴은 동일한 프로세스의 메모리 공간을 공유하며 데이터를 쉽게 공유할 수 있습니다. 다음과 같이 go 키워드를 사용하여 코루틴을 만듭니다.

go func() {
    // 协程体
}

Channels

채널은 코루틴 간에 값을 전달하는 데 사용되는 Go의 통신 메커니즘입니다. 채널은 단방향 또는 양방향일 수 있으며 버퍼링되거나 버퍼링되지 않을 수 있습니다. 아래와 같이 make 함수를 사용하여 채널을 만듭니다.

ch := make(chan int, 10)

연습 사례: 병렬 컴퓨팅

코루틴을 사용하여 병렬 컴퓨팅의 실제 사례를 구현해 보겠습니다. 우리는 코루틴 풀을 만들고 각 코루틴에서 소수의 큰 테이블을 계산합니다.

package main

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

const primeCount = 100000

// 计算素数
func isPrime(n int) bool {
    if n <= 1 {
        return false
    }
    for i := 2; i*i <= n; i++ {
        if n%i == 0 {
            return false
        }
    }
    return true
}

// 协程函数
func parallelPrimes(ch chan int) {
    for i := 0; i < primeCount; i++ {
        n := rand.Intn(100000)
        if isPrime(n) {
            ch <- n
        }
    }
}

func main() {
    // 创建通道和协程池
    ch := make(chan int, primeCount)
    for i := 0; i < 8; i++ {
        go parallelPrimes(ch)
    }

    // 等待协程池完成
    close(ch)

    start := time.Now()
    // 收集素数
    for prime := range ch {
        fmt.Println(prime)
    }
    elapsed := time.Since(start)
    fmt.Printf("Elapsed time: %v\n", elapsed)
}

이 경우에는 각각 100,000개의 소수를 계산하는 8개의 코루틴을 만들었습니다. 메인 코루틴은 소수를 수집하여 콘솔에 출력하는 역할을 합니다.

위 내용은 Golang 코루틴 및 동시성 모델의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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