ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Go 언어에서 Concurrency (동시성) 과 Parallelism (병렬성)
    Dev 2025. 3. 24. 00:06
    728x90

    🧪 예제 1: Concurrency (동시성) – goroutine 사용

    package main
    
    import (
    	"fmt"
    	"time"
    )
    
    func printSlow(text string) {
    	for i := 0; i < 5; i++ {
    		fmt.Println(text, i)
    		time.Sleep(500 * time.Millisecond)
    	}
    }
    
    func main() {
    	go printSlow("goroutine") // 비동기 실행
    	printSlow("main")         // 메인 스레드 실행
    }

     

    🔍 실행 결과 (예상)

    main 0
    goroutine 0
    main 1
    goroutine 1
    ...
    • main() 함수는 printSlow("main")을 실행하면서
    • 동시에 printSlow("goroutine")은 goroutine으로 동시 실행됨
    • 한 CPU 코어에서 context switching 하면서 동시성처럼 보임

    → 실제로는 빠르게 번갈아 가며 실행하는 concurrent behavior

     

    🧪 예제 2: Parallelism (병렬성) – runtime.GOMAXPROCS

    package main
    
    import (
    	"fmt"
    	"runtime"
    	"time"
    )
    
    func heavyTask(id int) {
    	start := time.Now()
    	for i := 0; i < 1e8; i++ {
    		_ = i * i
    	}
    	fmt.Printf("Task %d finished in %v\n", id, time.Since(start))
    }
    
    func main() {
    	runtime.GOMAXPROCS(2) // 👈 CPU 코어 2개 사용 설정
    
    	go heavyTask(1)
    	go heavyTask(2)
    
    	time.Sleep(5 * time.Second) // goroutine 완료 대기
    }

     

    🔍 실행 결과 (병렬 실행)

    Task 1 finished in 2.3s
    Task 2 finished in 2.4s

     

    • GOMAXPROCS(2) 설정을 통해 Go runtime이 2개의 OS 쓰레드를 사용
    • 두 heavyTask goroutine이 실제로 병렬로 실행됨

    GOMAXPROCS(1)이면 둘 다 순차 실행돼서 총 45초 걸림
    GOMAXPROCS(2)이면 병렬 실행 → 2
    3초 안에 완료

     

    핵심 요약

    항목동시성 (Concurrency)병렬성 (Parallelism)
    구현 go func() GOMAXPROCS(n) + goroutine
    실행 방식 번갈아 처리 동시에 처리
    예제 결과 순서 섞임 (논리적 동시) 작업 속도 빨라짐 (실제 동시)
    728x90

    'Dev' 카테고리의 다른 글

    바이브 코딩  (2) 2025.06.20
    go 언어에서 deep copy 사용  (0) 2025.03.24
    Go 언어 기원 및 설계 철학  (0) 2025.03.20
    Go에서 함수와 상수 이름의 시작 규칙 (대문자 vs. 소문자)  (0) 2025.03.03
    Go 언어의 Goroutine이란?  (0) 2025.03.02
Designed by Tistory.