Go에서 동시성을 구현하는 방법

3558 단어 gobeginners

Go에서 동시성을 구현하는 방법



Go는 다중 코어가 있는 최신 컴퓨터에서 실행되도록 설계되었습니다. Go는 고루틴과 채널을 통해 동시성을 직접 지원합니다. Go에서 동시 프로그램을 작성하는 것은 단일 키워드를 추가하는 것만큼 간단합니다. 바로 구현에 들어가겠습니다.

동시성이란 무엇입니까?



간단한 예를 들겠습니다. 책을 읽고 있는데 친구에게서 문자가 왔습니다. 이제 나는 텍스트를 보기 위해 휴대전화를 확인하기 위해 읽기를 중단합니다. 여기서 내가 실제로 하는 일은 많은 작업(이 경우 2개)을 처리하는 것입니다. 사람들은 비슷해 보이기 때문에 동시성과 병렬성을 혼동하는 경우가 많습니다. 병렬 처리는 작업을 동시에 수행하는 것입니다(좋아하는 음악을 들으면서 쓰기). 병렬 처리는 동시성의 일부라고 말할 수 있지만 그 반대의 경우도 마찬가지입니다.

동시성은 많은 작업을 독립적으로 수행하는 것입니다. 동시에 수행될 수도 있고 수행될 수도 있습니다.

Want to know more about concurrency go check out talk by Rob Pike



간단한 예



다음은 작업을 인쇄하는 간단한 작업을 수행하는 Go의 간단한 프로그램의 예입니다.

package main

import (
    "fmt"
)

func performTask(task int) {
    fmt.Println("Performing", task)
}

func main() {
    performTask(1)
    performTask(2)
    performTask(3)
}


산출

Performing 1
Performing 2
Performing 3


위의 프로그램은 문제 없이 완벽하게 작동합니다. 이제 동시접속을 해보자. 이동 중에 무언가를 동시에 실행하려면 in built 키워드go somethingYouWantToRun()를 사용합니다. 기본적으로 go 키워드는 함수를 고루틴으로 실행합니다.

고루틴이란



고루틴은 Go 런타임에서 관리하는 경량 스레드입니다. 기본적으로 고루틴은 m개의 고루틴이 n개의 OS 스레드에서 실행되는 스레드 상단의 추상화입니다. 따라서 실제로 성능의 작은 차이를 눈치채지 못한 채 3-4개의 OS 스레드에서 1000개의 고루틴을 실행할 수 있습니다.

고루틴을 사용한 예



이제 go 앞에 performTask(2) 키워드를 추가하여 백그라운드에서 실행되도록 합니다.

package main

import (
    "fmt"
)

func performTask(task int) {
    fmt.Println("Performing", task)
}

func main() {
    performTask(1)
    go performTask(2)
    performTask(3)
}


산출

Performing 1
Performing 3


위 프로그램의 출력을 보고 Performing 2 텍스트가 포함되어 있지 않다는 것을 알 수 있습니다. 여기서 정확히 무슨 일이 일어나고 있는지 설명하겠습니다. go 키워드가 있는 코드는 백그라운드에서 실행되므로 출력을 인쇄할 수 있을 때까지는 메인 스레드가 반환하고 Performing 2 를 인쇄하지 않습니다.

어떻게 해결할 수 있습니까? 보여드리겠습니다.

package main

import (
    "fmt"
    "sync"
)

func performTask(task int, wg *sync.WaitGroup) {
    fmt.Println("Performing", task)
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i <= 2; i++ {
        wg.Add(1)
        go performTask(i, &wg)
    }
    wg.Wait()
}


산출

Performing 2
Performing 0
Performing 1


이제 세 가지 작업이 모두 인쇄되는 것을 볼 수 있습니다. 우리가 한 일을 설명하겠습니다. 위의 동시성을 달성하기 위해 대기 그룹을 사용하고 있습니다.
  • var wg sync.WaitGroup : WaitGroup은 고루틴 모음이 완료될 때까지 기다립니다.
  • wg.Add(1) : 추가는 WaitGroup 카운터를 1씩 증가시킵니다.
  • wg.Done() : Done은 WaitGroup 카운터를 1만큼 감소시킵니다.
  • wg.Wait() : WaitGroup 카운터가 0이 될 때까지 대기가 차단됩니다.

  • 그래서 위에서 우리가 하는 것은 고루틴을 생성할 때마다 카운터를 하나씩 증가시켜 wg.Wait() 를 사용하여 모든 고루틴이 끝날 때까지 기다릴 수 있도록 하는 것입니다. 고루틴이 작업을 완료할 때마다 기본적으로 대기할 고루틴 수에 대한 카운터를 감소시키는wg.Done() 실행됩니다.

    결론



    Go에서는 다양한 방법으로 동시성을 구현할 수 있습니다. 방법 중 하나를 보여 드렸습니다. Go에서 채널 및 기타 동시성 패턴을 살펴볼 수 있습니다.

    If you liked this blog give me a shout-out in the comment and do share it on twitter. Also do let me know what would like me to write next.

    좋은 웹페이지 즐겨찾기