Golang - GoRoutine

Lumi·2022년 2월 15일
0

Golang

목록 보기
22/38
post-thumbnail

🔥 GoRoutine

기본적으로 프로세스는 일종의 프로그램이 실행될떄 담당하는 메모리?? 정도로 이해를 하였습니다.

멀티 쓰레드라는 기능을 통해서 다양한 쓰레드를 하나의 코어를 번걸아가며 사용하는 방식을 사용하게 됩니다.

  • 일반적인 경우에는

이런 방식으로 쓰레드가 코어와 전환이 될 떄에는 비용이 발생하는데 이를 컨텍스트 스위칭 이라고 합니다.

멀티 프로세스 vs 멀티 쓰레드

계산기라는 프로그램을 실행시키면 하나의 프로세스가 생성이 됩니다.

이후 또 계산기를 실행시키면 또다른 프로세스가 생성이 되고 이를 멀티 프로세스라고 부르게 됩니다.

멀티 쓰레드는 하나의 프로세스에 대해서 작동을 하는 것을 말합니다.

프로세스 하나에서 동작을 하는 것을 쓰레드라고 하고 프로세스 하나에서는 많은 작업이 가능하기 떄문에 멀티 쓰레드로 동작을 한다고 말 할수 있습니다.

go에서 사용하는 비동기

비동기 방식은 여러개의 코드를 순서에 제약을 두지 않고 실행시키는 방법 입니다.

package main

import (
	"fmt"
	"time"
)

func PrintHangul() {
	test := []string{"가", "나", "다", "라"}

	for _, v := range test {
		time.Sleep(300 * time.Millisecond)
		fmt.Printf("%s", v)
	}
}

func PrintNumbers() {
	for i := 1; i <= 5; i++ {
		time.Sleep(400 * time.Millisecond)
		fmt.Printf("%d", i)
	}
}

func main() {
	go PrintHangul()
	go PrintNumbers()
    
    time.Sleep(3 * time.Second)
}
  • time.Sleep 부분은 코드가 실행되는 시간을 설정?? 하는 부분입니다.

이렇게 하드코딩 하는 방법도 있지만 go에서 자동으로 해야할 작업을 설정해줄수도 있습니다.

package main

import (
	"fmt"
	"sync"
)

var wg sync.WaitGroup

func SumAtoB(a, b int) {
	sum := 0
	for i := a; i <= b; i++ {
		sum += i
	}

	fmt.Println(sum)
	wg.Done()
}

func main() {
	wg.Add(10)

	for i := 0; i < 10; i++ {
		go SumAtoB(1, 1000000)
	}

	wg.Wait()
}
  • sync.WaitGroup를 활용하는 방법 입니다.

최초 Add를 통해서 해야할 작업의 수를 지정해 줍니다.

  • 여기에서는 10개가 됩니다.

그후 10개의 작업을 진행을 하게 되는데 이떄 작업이 한개 진행이 될떄마다 자동으로 wg에 저장되어있던 작업이 한개씩 삭제가 됩니다.

  • 그러기 떄문에 for문을 10개만 돌리게 됩니다.

마지막에는 Wait를 통해서 작업이 마무리 될 떄까지 대기하라는 코드를 추가해 줍니다.

이 부분은 사실 이론적인 내용이 주를 이루어서 따로 영상을 촬영하지는 않았고 개인적으로 학습후 나중에 복습을 할 예정입니다.

profile
[기술 블로그가 아닌 하루하루 기록용 블로그]

0개의 댓글