본문 바로가기
IT 초보코딩의 세계/Go 언어

Go언어의 동시성 과 Goroutine, 데이터공유 1장

by 조이럭키7 2023. 4. 4.
반응형

◆ 동시성(Concurrency) 란?

프로그램을 여러 독립된 작은 단위로 나누고 주어진 자원을 사용해 빠르게 동시다발적으로 수행하는 행위

동시성의 개념은 스레드보다 더 포괄적

스레드

     ● 스레드는 프로그램을 병렬로 수행할 수 있도록 OS에서 지원하는 기능

     ● Part1 Part 2로 구성된 프로그램을 예로 들어보면 Part 1Thread One이 수행하고 Part 2Thread Two가 수행하는 경우 아래 그림처럼 두 파트는 동시에 수행

 

     ● 프로그램의 전체적인 흐름을 유지하면서 독립적인 작업을 빠르게 수행할 수 있는 소프트웨어 개발에서 매우 중요한 기술

     ● Go 언어와 대다수의 최신 프로그래밍 언어는 프로그램을 여러 개의 작은 독립된 작업으로 나누고 사용 가능한 스레드를 활용해 다중화(MuItiplexing) 해서 수행하는 것을 지원

     ● GO 언어는 스레드 사이의 작업 스케줄링과 분산 처리를 담당하는 복잡한 알고리즘을 간결한 API 형태로 제공해서 개발자는 스레드와 자원 할당, 스케줄링 같은 로우 레벨 개념은 신경 쓰지 않고 애플리케이션 개발에 집중하도록 함

Goroutine

경량 스레드

고루틴으로 정의된 코드는 런타임에 다른 고루틴 과 동시에 실행

모든 GO 함수는 고루틴에 속하는데 프로그램의 진입점인 main 함수는 메인 고루틴에 속함

동시에 실행할 함수 앞에 go 키워드만 붙여주면 됨

package main

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

func f(n int) {
  r := rand.Intn(100)          // 랜덤한 숫자 생성
  time.Sleep(time.Duration(r)) // 랜덤한 시간 동안 대기
  fmt.Println(n)               // n 출력
}

func main() {
  runtime.GOMAXPROCS(runtime.NumCPU()) // CPU 개수를 구한 뒤 사용할 최대 CPU 개수 설정
  fmt.Println(runtime.GOMAXPROCS(0)) // 설정 값 출력
  fmt.Println("======================")
  for i := 0; i < 100; i++ {
  go f(i)
  }

  fmt.Scanln()
}

◆ 데이터 공유

여러 스레드를 사용하는 프로그램에서 데이터 공유는 잠금(Lock)을 거는 방식을 주로 사용하는데 이 방법을 메모리 공유 방식(sharing memory approach)이라고 부름

Go에서는 메모리 공유 방식을 지양하고 채널을 이용하는 것을 권장

일반 채널 과 버퍼 채널 2가지를 제공


다음은 채널(Channel)에 대해서 알아보는 시간을 가져보자

https://joylucky7.tistory.com/34

 

Go언어의 채널(Channel), Select 구문, Sync 패키지 2장

동시성과 고루틴, 데이터 공유에 대해서 학습하지 않았다면 아래포스팅을 다시한번 보고 오자. https://joylucky7.tistory.com/33 Go언어의 동시성 과 Goroutine, 데이터공유 1장 ◆ 동시성(Concurrency) 란? ▶

joylucky7.tistory.com

 

반응형

댓글