◆ 동시성(Concurrency) 란?
▶ 프로그램을 여러 독립된 작은 단위로 나누고 주어진 자원을 사용해 빠르게 동시다발적으로 수행하는 행위
▶ 동시성의 개념은 스레드보다 더 포괄적
▶ 스레드
● 스레드는 프로그램을 병렬로 수행할 수 있도록 OS에서 지원하는 기능
● Part1 과 Part 2로 구성된 프로그램을 예로 들어보면 Part 1은 Thread One이 수행하고 Part 2는 Thread 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
'IT 초보코딩의 세계 > Go 언어' 카테고리의 다른 글
Go언어의 조건변수, Once 사용법, Pool 구조체 3장 (0) | 2023.04.05 |
---|---|
Go언어의 채널(Channel), Select 구문, Sync 패키지 2장 (0) | 2023.04.04 |
Go언어의 구조체(포인터, Struct) 1장 (6) | 2023.03.30 |
Go언어의 자료구조 맵(Map)와 컨테이너 (0) | 2023.03.30 |
Go언어의 자료구조 배열과 슬라이스 1장 (6) | 2023.03.29 |
댓글