(๐ŸญGo) Goroutine

ํ‘๋งˆ๋ฒ•์‚ฌ๊ฐ€ ๋˜์–ด๋ณด์ž

1 minute read

๋“œ๋””์–ด Golang์„ ๋ฐฐ์šฐ๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ์ธ ๊ณ ๋ฃจํ‹ด(Goroutine) ์†Œ๊ฐœ์ด๋‹ค.

ํ•œ๋ฒˆ ์‚ฌ์šฉํ•ด๋ณด์ž

func sexyCount(person string) {  
	for i := 0; i < 10; i++ {  
		fmt.Println(person, "is sexy", i)  
		time.Sleep(time.Second)  
	}  
}  
  
func main() {  
	go sexyCount("nico")  
	sexyCount("flynn")  
}  

๋‘ ๋ฒˆ์˜ sexyCount ํ˜ธ์ถœ์ด ์žˆ๋Š”๋ฐ ๋™์‹œ์— ์‹คํ–‰์ด ๋œ๋‹ค. go๋งŒ ์•ž์— ๋ถ™์ด๋ฉด concurrenncyํ•˜๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค.
๊ณจ๋•Œ๋ฆฐ๋‹ค ์ •๋งโ€ฆ

func main() {  
	go sexyCount("nico")  
	go sexyCount("flynn")  
}  

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด? ์•„๋ฌด์ถœ๋ ฅ ์—†์ด ํ”„๋กœ๊ทธ๋žจ์ด ๋๋‚˜๋ฒ„๋ฆฐ๋‹ค.

mainํ•จ์ˆ˜๋Š” goroutine์„ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๋Š”๋‹ค!
์–ด์ฐŒ๋˜์—ˆ๊ฑด ์ „์ฒด ํ๋ฆ„์€ ์žˆ์–ด์•ผํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

go sexyCount("nico")  
go sexyCount("flynn")  
time.Sleep(time.Second * 5)  

์ด๋Ÿฐ์‹์œผ๋กœ sleep์„ ํ•ด๋ณด๋ฉด ์ž˜๋Œ์•„๊ฐ„๋‹ค.

Channel

๋‹ค์Œ์€ Channel๊ฐœ๋…์ด๋‹ค. channel์€ goroutine๊ณผ main ํ•จ์ˆ˜ ์‚ฌ์ด์— ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ๊ฒฐ๊ตญ ๋ฉ€ํ‹ฐ์ฝ”์–ด๋กœ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ๋ฅผ ๋Œ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์€ ๊ฒฐ๊ณผ๋ฅผ ์ทจํ•ฉํ•˜๋Š” ์ผ์ด ์ƒ๊ธฐ๊ฒŒ ๋˜์–ด ์žˆ๋‹ค. ๊ทธ๋Ÿด ๋•Œ๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์ด ์ฑ„๋„์ด๋‹ค.

ํ˜น์€ goroutine๊ณผ goroutine ์‚ฌ์ด์— ํ†ต์‹ ์„ ์œ„ํ•ด์„œ๋„ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค. ๋ณดํ†ต์˜ ๋ฉ€ํ‹ฐ์“ฐ๋ ˆ๋“œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค๋ฉด ์ด๋Ÿฐ์ผ์„ ํ•˜๊ธฐ์œ„ํ•ด ์•„์ฃผ ํฐ ๋…ธ๋ ฅ์ด ๋“ค๊ฒƒ์ด๋‹ค. (C++๋กœ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ณด์žโ€ฆ)

func main() {  
	c := make(chan bool)        // 1. ์ฑ„๋„์„ ๋งŒ๋“ ๋‹ค c๋Š” ์ฑ„๋„์˜ ์ด๋ฆ„์ด๋‹ค  
	people := [2]string{"nico", "flynn"}  
	for _, person := range people {  
		go isSexy(person, c)    // 2. ๊ณ ๋ฃจํ‹ด์˜ ์ธ์ž๋กœ ์ฑ„๋„์„ ๋„˜๊ฒจ์ค€๋‹ค  
	}  
	fmt.Println(<-c)    // 5. <- ์—ฐ์‚ฐ์ž๋กœ ์ฑ„๋„๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐ›์„๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•œ๋‹ค. sleep ํ•„์š”์—†๋‹ค.  
	fmt.Println(<-c)    // <-๋ฅผ ์“ฐ๋ฉด ์ด ๋ฌธ์žฅ์€ ๋ธ”๋กœํ‚น์—ฐ์‚ฐ์ด ๋œ๋‹ค.  
	fmt.Println(<-c)    // ๊ณ ๋ฃจํ‹ด์€ ๋‘๊ฐœ๊ฐ€ ๋„๋Š”๋ฐ 3๊ฐœ์˜ ์ฑ„๋„์„ ๊ธฐ๋‹ค๋ฆฌ๋ฏ€๋กœ ๋ฐ๋“œ๋ฝ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์ด ์ฃฝ๋Š”๋‹ค.  
}  
  
func isSexy(person string, c chan bool) {    // 3. ์ฑ„๋„์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ํŒŒ๋ผ๋ฉ”ํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค  
	time.Sleep(time.Second * 5)  
	fmt.Println(person)  
	c <- true      // 4. ์ฑ„๋„๋กœ ๊ฐ’์„ ์ค€๋‹ค. ๋ฆฌํ„ด๊ฐ™์€ ๊ฐœ๋…์ด๋‹ค.  
}  
  
result := <-c;  

:= <-๋ผ๋‹ˆโ€ฆ๋ญ”๊ฐ€ ๊ณ ๋Œ€๋ฌธ์ž์Šค๋Ÿฝ์ง€๋งŒ ์ €๊ฒƒ์ด ๊ฒฐ๊ณผ๋ฅผ ์ทจํ•ฉ๋ฐ›๊ธฐ ์œ„ํ•œ ์ฝ”๋“œ์ด๋‹ค. ๊ธฐ๊ดดํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋ง๊ณ  ๊ท€์—ฝ๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ•ด๋ณด์ž(โ€ฆ)

func hitURL(url string, c chan<- result)   

์—ฌ๊ธฐ์„œ chan<- ์ด ์˜๋ฏธ๋Š” ์ฑ„๋„์„ ํ†ตํ•œ sendOnly๋ผ๋Š” ๋œป์ด๋‹ค. hitURL์—์„œ๋Š” ์ฑ„๋„์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„์ˆ˜๋Š” ์—†๋‹ค. ํ™”์‚ดํ‘œ๊ฐ€ ์˜ค๋ฅธ์ชฝ์ธ์ง€ ์™ผ์ชฝ์ธ์ง€๋ฅผ ๊ตฌ๋ถ„ํ•˜์ž.