>  기사  >  백엔드 개발  >  Go 언어의 동시성과 병렬성의 차이점 탐구

Go 언어의 동시성과 병렬성의 차이점 탐구

王林
王林원래의
2024-03-12 21:33:03396검색

Go 언어의 동시성과 병렬성의 차이점 탐구

Go 언어에서 동시성과 병렬성의 차이점 탐구

Go 언어에서는 동시성과 병렬성의 개념을 자주 듣습니다. 이 두 단어는 종종 같은 의미로 사용되지만 실제로는 다른 의미를 가지고 있습니다. 이 기사에서는 Go 언어의 동시성과 병렬성의 차이점을 살펴보고 특정 코드 예제를 사용하여 차이점을 설명합니다.

먼저 동시성과 병렬성의 정의를 살펴보겠습니다.

  • 동시성(동시성)은 일정 기간 내에 여러 작업을 처리하는 것을 의미하며 이러한 작업은 동시에 수행되지 않고 교대로 수행될 수 있습니다. 시스템 응답성과 효율성.
  • 병렬성이란 여러 작업을 동시에 처리하는 것을 의미합니다. 이러한 작업은 더 빠른 처리 속도를 달성하기 위해 동시에 여러 프로세서에서 실행됩니다.

Go 언어에서는 고루틴을 통해 동시성이 달성됩니다. 고루틴은 Go 언어의 경량 스레드이며 Go 언어의 런타임 시스템에 의해 예약되며 단일 스레드에서 동시 실행을 달성할 수 있습니다. 고루틴은 go 키워드를 통해 생성할 수 있으므로 함수가 독립적인 고루틴에서 실행될 수 있습니다. go可以创建一个goroutine,使函数在一个独立的goroutine中执行。

让我们通过一个简单的示例来说明并发和并行的区别:

package main

import (
    "fmt"
    "runtime"
    "time"
)

func task(id int) {
    for i := 0; i < 5; i++ {
        fmt.Printf("Task %d: %d
", id, i)
        time.Sleep(time.Millisecond * 100)
    }
}

func main() {
    runtime.GOMAXPROCS(2) // 设置使用的最大CPU核心数

    go task(1)
    go task(2)

    time.Sleep(time.Second)
}

在上面的代码中,我们定义了两个函数task,每个函数打印5次任务的信息,并在每次打印后暂停100毫秒。在main函数中,我们通过go关键字启动了两个goroutine来执行这两个任务函数。最后,通过time.Sleep函数等待1秒钟,确保两个goroutine足够时间执行完毕。

通过运行以上代码,我们可以看到两个goroutine的任务交替执行,而不是同时执行。这就是并发的概念,尽管任务在同一个线程上交替执行,但在时间上感觉上是并行的,因为它们几乎同时发生。

为了实现并行,我们可以将代码进行一些调整:

package main

import (
    "fmt"
    "runtime"
)

func task(id int) {
    for i := 0; i < 5; i++ {
        fmt.Printf("Task %d: %d
", id, i)
    }
}

func main() {
    runtime.GOMAXPROCS(2) // 设置使用的最大CPU核心数

    go task(1)
    go task(2)

    // 等待任务完成
    fmt.Scanln()
}

在这个修改后的代码中,我们去除了任务函数中的时间暂停,并通过fmt.Scanln()函数让程序等待用户的输入。这样两个goroutine的任务将真正地同时执行,因为它们没有通过时间暂停被阻塞,这就实现了并行的效果。

通过这个示例,我们可以清晰地看到并发和并行的区别。并发是通过在单线程上交替执行多个任务来提高效率,而并行则是真正地同时运行多个任务在多个处理器上。在Go语言中,通过goroutine和GOMAXPROCS

간단한 예를 통해 동시성과 병렬성의 차이를 설명해 보겠습니다.

rrreee

위 코드에서는 두 개의 함수 task를 정의합니다. 각 함수는 작업 정보를 5번 인쇄하고 100밀리초 동안 일시 중지합니다. 각 인쇄 후. main 함수에서는 go 키워드를 통해 두 개의 고루틴을 시작하여 이 두 가지 작업 함수를 실행합니다. 마지막으로, 두 고루틴이 실행을 완료하는 데 충분한 시간이 있는지 확인하기 위해 time.Sleep 함수를 통해 1초 동안 기다립니다.

위의 코드를 실행해보면, 두 고루틴의 작업이 동시에가 아닌 교대로 실행되는 것을 확인할 수 있습니다. 이것이 동시성의 개념입니다. 작업이 동일한 스레드에서 교대로 실행되지만 거의 동시에 발생하기 때문에 시간적으로 평행하다고 느껴집니다. 🎜🎜병렬성을 달성하기 위해 코드를 일부 조정할 수 있습니다. 🎜rrreee🎜이 수정된 코드에서는 작업 함수에서 시간 일시 중지를 제거하고 fmt.Scanln() 함수를 전달합니다. 프로그램이 사용자 입력을 기다리도록 합니다. 이러한 방식으로 두 개의 고루틴 작업은 실제로 동시에 실행됩니다. 왜냐하면 시간 일시 중지로 인해 차단되지 않고 병렬 효과를 얻을 수 있기 때문입니다. 🎜🎜이 예를 통해 동시성과 병렬성의 차이를 명확하게 볼 수 있습니다. 동시성은 단일 스레드에서 여러 작업을 교대로 실행하여 효율성을 향상시키는 반면, 병렬성은 실제로 여러 프로세서에서 동시에 여러 작업을 실행합니다. Go 언어에서는 고루틴과 GOMAXPROCS 함수를 통해 동시성과 병렬성을 쉽게 달성할 수 있습니다. 🎜🎜일반적으로 Go 언어에서 동시 프로그래밍 적용을 이해하려면 동시성과 병렬성의 개념을 익히는 것이 중요합니다. 둘 사이의 차이점을 깊이 이해해야만 Go 언어의 기능을 더 잘 활용하여 효율적인 동시 프로그램을 작성할 수 있습니다. 🎜🎜이 글을 통해 독자들이 Go 언어의 동시성과 병렬성 개념을 더 명확하게 이해하고, 구체적인 코드 예제를 통해 이 두 개념에 대한 이해도 깊어질 수 있기를 바랍니다. 실제 Go 언어 프로그래밍에서 동시성 및 병렬 기술을 유연하게 사용하면 프로그램의 성능과 효율성을 향상시키는 데 도움이 됩니다. 🎜

위 내용은 Go 언어의 동시성과 병렬성의 차이점 탐구의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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