๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Server/Python, Go, Golang

Goroutine

 

๐Ÿ”„ Goroutine ๊ณ ๋ฃจํ‹ด

: Go ์–ธ์–ด์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์Šค๋ ˆ๋“œ (OS์— ์˜ํ•ด ๊ด€๋ฆฌ๋˜์ง€ ์•Š๊ณ , Go ๋Ÿฐํƒ€์ž„์ด ๊ด€๋ฆฌํ•˜๋Š” User-level ์Šค๋ ˆ๋“œ)

 

`go func() {}`

 

  • ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฉ”์„ธ์ง€๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ
  • ์ˆ˜์ฒœ ๊ฐœ์˜ ๊ณ ๋ฃจํ‹ด์„ ์‹คํ–‰ํ•ด๋„ ํšจ์œจ์ 
  • Go ๋Ÿฐํƒ€์ž„์ด ๊ณ ๋ฃจํ‹ด์„ ์ž๋™ ๊ด€๋ฆฌ

 

Goroutine์€ ๋™์‹œ์„ฑ(Concurrency)๊ณผ ๋ณ‘๋ ฌ์„ฑ(Parallelism)์„ ํšจ์œจ์ ์œผ๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ณ ๋ฃจํ‹ด์˜ ๋™์‹œ์„ฑ ์œ ๋ฌด ์ฐจ์ด๋Š” ์ด ์˜์ƒ(Go Concurrency Explained: Go Routines & Channels)์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์ดํ•ดํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

*๋™์‹œ์„ฑ: ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ํšจ์œจ์  ์‹คํ–‰

*๋ณ‘๋ ฌ์„ฑ: ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์‹ค์ œ๋กœ ๋™์‹œ์— ์‹คํ–‰

 

 

 

 

 

 

 

โ–ถ๏ธ Channel ์ฑ„๋„

: Goroutine๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ํŒŒ์ดํ”„๋ผ์ธ

 

`chan` `<-`

 

  • ๊ณ ๋ฃจํ‹ด ๊ฐ„์˜ ํ†ต์‹ 
  • ํŠน์ • ๋ฐ์ดํ„ฐ ํƒ€์ž…๋งŒ ์ „์†ก ๊ฐ€๋Šฅ
  • ๊ณ ๋ฃจํ‹ด ๊ฐ„์˜ ๋™๊ธฐํ™” ์ž๋™ ์ฒ˜๋ฆฌ

 

Channel์€ ๊ณ ๋ฃจํ‹ด์ด ๋ฐ์ดํ„ฐ๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ฃผ๊ณ ๋ฐ›๊ธฐ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

producer-consumer ๊ตฌ์กฐ๋กœ ์ฑ„๋„์€ ์ด๋“ค ์‚ฌ์ด์—์„œ ๋ฐ์ดํ„ฐ ์ „๋‹ฌ ๋ฐ ๋™๊ธฐํ™” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

 

โธ๏ธ WaitGroup

: ๊ณ ๋ฃจํ‹ด๋“ค์˜ ์ž‘์—… ์™„๋ฃŒ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋„๊ตฌ

 

`Add()` : ๋Œ€๊ธฐํ•  ๊ณ ๋ฃจํ‹ด ์ˆ˜ ๋“ฑ๋ก

`Done()` : ๊ณ ๋ฃจํ‹ด ์ž‘์—… ์™„๋ฃŒ ์•Œ๋ฆฌ๊ธฐ

`Wait()` : ๋ชจ๋“  ๊ณ ๋ฃจํ‹ด์ด ๋๋‚  ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐํ•˜๊ธฐ

 

 

๊ณ ๋ฃจํ‹ด์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋ฉ”์ธ ํ”„๋กœ๊ทธ๋žจ์ด ๋จผ์ € ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๊ณ ๋ฃจํ‹ด์ด ๊ฐ•์ œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

์ด ๋•Œ๋ฌธ์— WaitGroup์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์—ฌ๋Ÿฌ ๊ณ ๋ฃจํ‹ด๋“ค์„ ๊ด€๋ฆฌํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.