>  기사  >  백엔드 개발  >  Golang은 병렬성을 구현합니다.

Golang은 병렬성을 구현합니다.

WBOY
WBOY원래의
2023-05-21 19:12:36552검색

빅데이터, 인공지능 등 기술의 급속한 발전으로 인해 고성능, 높은 동시성에 대한 요구도 점점 높아지고 있습니다. 이러한 맥락에서 golang은 높은 동시성 및 고성능 프로그래밍 언어로 매우 인기가 높습니다. 그 중 golang의 병렬 기능은 다른 언어와 구별되는 중요한 기능 중 하나입니다. 이 기사에서는 golang에서 병렬성을 구현하는 방법과 병렬성을 통해 가져온 성능 향상에 대해 주로 설명합니다.

1. 병렬성 개요

병렬이란 여러 작업을 동시에 실행하는 것을 의미하지 않습니다. 단일 CPU에서는 한 번에 하나의 명령만 실행할 수 있지만, 각 명령의 실행 시간은 매우 짧습니다. CPU는 빠른 회전을 통해 사용자 관점에서 멀티 태스킹을 완료합니다. 이러한 빠른 회전으로 인해 작업 전환 시간이 매우 짧아지며 동시에 여러 작업이 수행되는 것처럼 보입니다. 이것이 병렬성입니다.

실용 응용 프로그램에서는 일반적으로 병렬 기술을 사용하여 동시성 및 밀도가 높은 비즈니스 시나리오를 처리합니다. 멀티 코어 CPU의 특성을 활용하여 동시 실행을 위해 작업을 여러 코어에 할당하여 실행 효율성을 높입니다. golang에서는 고루틴을 경량 스레드라고 합니다. 이는 스레드보다 더 가볍고 효율적이며, 고루틴을 시작하면 오버헤드가 거의 필요하지 않습니다. 따라서 golang은 당연히 병렬 작업을 구현하는 데 적합합니다.

2. 고루틴 병렬화

golang에서는 고루틴을 통해 병렬 연산을 구현할 수 있습니다. 고루틴은 golang 런타임 시스템에 의해 관리되는 경량 스레드이며 운영 체제 스레드처럼 많은 메모리를 소비하지 않습니다. 따라서 동시에 많은 고루틴을 시작할 수 있고 작업 대기 시간을 줄이고 프로그램 실행을 향상시킬 수 있습니다. 능률. 고루틴을 시작하는 방법을 살펴보겠습니다.

1. 고루틴 정의

golang에서 고루틴을 정의하는 방법은 매우 간단합니다. 독립적으로 실행해야 하는 함수 본문 앞에 go 키워드만 추가하면 됩니다. 예:

go func() {
    fmt.Println("Hello, goroutine!")
}()

2. 고루틴 시작

고루틴을 시작하는 것은 매우 간단합니다. 함수를 호출하기만 하면 됩니다. 예:

func main() {
    go func() {
        fmt.Println("Hello, goroutine!")
    }()
    fmt.Println("Hello, main!")
    time.Sleep(time.Second)
}

위 코드에서 우리는 문장을 인쇄하기 위해 고루틴을 시작하고, 메인 함수는 계속해서 자체 단어를 인쇄하고 1초 동안 멈춥니다. 이때 프로그램을 실행하면 main 함수와 goroutine이 Hello, main!과 Hello, goroutine!을 교대로 출력하는 것을 볼 수 있는데, 이는 두 함수가 서로 다른 고루틴에서 병렬로 실행된다는 것을 증명합니다.

3. 채널

Channel(채널)은 golang에서 제공하는 스레드 간 통신 메커니즘입니다. 그 기능은 고루틴 간에 데이터를 전송하는 것입니다. 채널에는 송신 측과 수신 측이라는 두 개의 끝점이 있습니다. make 키워드를 통해 채널을 만든 다음 <-를 사용하여 데이터를 전송할 수 있습니다. 예: make来创建一个通道,然后利用<-来进行数据的传递。例如:

func goroutineFunc(c chan int) {
    c <- 1
}

func main() {
    c := make(chan int)
    go goroutineFunc(c)
    result := <-c
    fmt.Println(result)
}

上面的代码中,我们在启动goroutine的同时也创建了一个通道c,然后在goroutine中用c <- 1向通道中写入1,最后通过result := <-c

func pi(n int) float64 {
    ch := make(chan float64)
    for i := 0; i < n; i++ {
        go func(start, end int) {
            sum := 0.0
            for j := start; j < end; j++ {
                x := (float64(j) + 0.5) / float64(n)
                sum += 4.0 / (1.0 + x*x)
            }
            ch <- sum
        }(i*n/n, (i+1)*n/n)
    }
    result := 0.0
    for i := 0; i < n; i++ {
        result += <-ch
    }
    return result / float64(n)
}

func main() {
    fmt.Println(pi(10000))
}

위 코드에서는 고루틴을 시작하는 동안 채널 c를 생성한 다음 c <- 1를 사용하여 고루틴의 채널에 1을 쓰고 마지막으로 result := <-c - 데이터를 읽습니다. 이 방법은 다양한 고루틴에서 데이터를 교환하고 대규모 병렬 작업을 수행할 수 있습니다.

3. 병렬 컴퓨팅

병렬 컴퓨팅을 수행하려면 실행을 위해 컴퓨팅 작업을 여러 고루틴에 할당하고 채널을 통해 데이터를 교환해야 합니다. 아래에서는 샘플 코드를 사용하여 golang을 사용하여 병렬 컴퓨팅을 구현하는 방법을 보여줍니다.

1. 파이 값의 병렬 계산

func MatrixMul(a, b [][]int) [][]int {
    m, n, p := len(a), len(a[0]), len(b[0])
    c := make([][]int, m)
    for i := 0; i < m; i++ {
        c[i] = make([]int, p)
    }

    ch := make(chan int)
    for i := 0; i < m; i++ {
        for j := 0; j < p; j++ {
            go func(x, y int) {
                sum := 0
                for k := 0; k < n; k++ {
                    sum += a[x][k] * b[k][y]
                }
                ch <- sum
            }(i, j)
        }
    }

    for i := 0; i < m; i++ {
        for j := 0; j < p; j++ {
            c[i][j] = <-ch
        }
    }

    return c
}

func main() {
    a := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
    b := [][]int{{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}
    fmt.Println(MatrixMul(a, b))
}

위 코드에서는 먼저 길이가 n인 채널 ch를 만든 다음 n개의 고루틴을 사용하여 계산을 수행하고 계산 결과를 채널에 씁니다. 마지막으로 채널의 모든 결과 합계를 읽고 π 값을 계산합니다. 병렬 컴퓨팅을 통해 계산 속도를 크게 높일 수 있습니다.

2. 행렬 곱셈의 병렬 계산

rrreee

위 코드에서는 고루틴을 사용하여 행렬의 곱을 병렬로 계산합니다. 컴퓨팅 작업을 고루틴에 할당한 다음 채널을 통해 데이터를 교환합니다. 마지막으로 채널의 모든 결과를 읽고 제품 매트릭스를 구성합니다. 병렬 컴퓨팅을 통해 컴퓨팅 속도를 높이고 컴퓨팅 비용을 줄일 수 있습니다.

요약

이 글에서는 고루틴을 사용하여 고랭에서 병렬 컴퓨팅을 구현하는 방법과 고루틴 및 채널을 사용하는 방법을 주로 소개합니다. 병렬 컴퓨팅을 통해 컴퓨팅 작업을 여러 고루틴에 할당하여 프로그램 실행 효율성을 향상시킬 수 있으며 높은 동시성 및 고밀도 비즈니스 시나리오를 처리하는 데 적합합니다. Golang에 내장된 고루틴과 채널 메커니즘은 다른 언어보다 병렬 작업을 더 쉽고 효율적으로 만듭니다. 🎜

위 내용은 Golang은 병렬성을 구현합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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