Goroutine(draft)

Goroutine and Channel

Go์–ธ์–ด์˜ ํŠน์ง• ์ค‘ ํ•˜๋‚˜๋Š” ๋™์‹œ์„ฑ์ด๋‹ค.

๋™์‹œ์„ฑ์ด๋ž€ ํ”„๋กœ๊ทธ๋žจ์ด ์ˆœ์ฐจ์ ์ธ ํ๋ฆ„์œผ๋กœ ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜์–ด ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ์„ ๋งํ•œ๋‹ค.

Go ์–ธ์–ด๋Š” ์ด๋Ÿฌํ•œ ๋™์‹œ์„ฑ์„ ์œ„ํ•ด ๊ณ ๋ฃจํ‹ด(goroutine)๊ณผ ์ฑ„๋„(channel)์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.


Goroutine

Goroutine(๊ณ ๋ฃจํ‹ด) Go ๋Ÿฐํƒ€์ž„์ด ๊ด€๋ฆฌํ•˜๋Š” Lightweight ๋…ผ๋ฆฌ์ (ํ˜น์€ ๊ฐ€์ƒ์˜) ์Šค๋ ˆ๋“œ์ด๋‹ค.

Go์—์„œ go ํ‚ค์›Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด ๋Ÿฐํƒ€์ž„์‹œ ์ƒˆ๋กœ์šด ๊ณ ๋ฃจํ‹ด์„ ์ƒ์„ฑํ•œ๋‹ค.

๊ณ ๋ฃจํ‹ด์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ํ•จ์ˆ˜ ๋ฃจํ‹ด์„ ์‹คํ–‰ํ•˜๋ฏ€๋กœ, ์—ฌ๋Ÿฌ ์ฝ”๋“œ๋ฅผ ๋™์‹œ์—(Concurrently) ์‹คํ–‰ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค.

๊ณ ๋ฃจํ‹ด์€ OS ์Šค๋ ˆ๋“œ๋ณด๋‹ค ํ›จ์”ฌ ๊ฐ€๋ณ๊ฒŒ ๋น„๋™๊ธฐ Concurrent ์ฒ˜๋ฆฌ๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•˜์—ฌ ๋งŒ๋“  ๊ฒƒ์œผ๋กœ, ๊ธฐ๋ณธ์ ์œผ๋กœ Go ๋Ÿฐํƒ€์ž„์ด ์ž์ฒด ๊ด€๋ฆฌํ•œ๋‹ค.

Go ๋Ÿฐํƒ€์ž„ ์ƒ์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ณ ๋ฃจํ‹ด๋“ค์€ ์ข…์ข… ํ•˜๋‚˜์˜ OS ์Šค๋ ˆ๋“œ๋กœ๋„ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰, ๊ณ ๋ฃจํ‹ด๋“ค์€ OS ์Šค๋ ˆ๋“œ์™€ 1๋Œ€1 ๋Œ€์‘๋˜์ง€ ์•Š๊ณ  Multiplexing์œผ๋กœ ํ›จ์”ฌ ์ ์€ OS ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ ์ธก๋ฉด์—์„œ๋„ OS ์Šค๋ ˆ๋“œ๊ฐ€ 1๋ฉ”๊ฐ€๋ฐ”์ดํŠธ์˜ ์Šคํƒ์„ ๊ฐ–๋Š” ๋ฐ˜๋ฉด,

๊ณ ๋ฃจํ‹ด์€ ์ด๋ณด๋‹ค ํ›จ์”ฌ ์ž‘์€ ๋ช‡ ํ‚ฌ๋กœ๋ฐ”์ดํŠธ์˜ ์Šคํƒ์„ ๊ฐ–๋Š”๋‹ค(ํ•„์š” ์‹œ ๋™์ ์œผ๋กœ ์ฆ๊ฐ€).

go ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์„œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜(A)๋Š” ํ˜„์žฌ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” ํ•จ์ˆ˜(B)์™€ ํ๋ฆ„์ด ๊ตฌ๋ถ„๋˜์–ด ๋ณ„๊ฐœ๋กœ ๋™์ž‘ํ•œ๋‹ค.

์—ฌ๊ธฐ์„œ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜ A๋Š” ๋™์‹œ์„ฑ์„ ๊ฐ€์ง„๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ,

๊ณ ๋ฃจํ‹ด๋ผ๋ฆฌ์˜ ์˜์กด๊ด€๊ณ„๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ณ ๋ฃจํ‹ด ํ•จ์ˆ˜์˜ ์‹คํ–‰ ์ˆœ์„œ๋Š” ํ”„๋กœ๊ทธ๋žจ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋Š”๋‹ค.

์ฆ‰ ๊ณ ๋ฃจํ‹ด์€ ํ•จ์ˆ˜์˜ ์‹คํ–‰์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Goroutine ์ œ์–ดํ•˜๊ธฐ

ํ๋ฆ„์ด ๋ถ„๋ฆฌ๋œ ๊ณ ๋ฃจํ‹ด์€ sync ํŒจํ‚ค์ง€๋ฅผ ํ†ตํ•ด ์ œ์–ดํ•ด์•ผ ํ•œ๋‹ค.

sync ํŒจํ‚ค์ง€๋Š” mutual exclusion lock๊ณผ ๊ฐ™์€ ๋™๊ธฐํ™” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

ํ”ํžˆ ์‚ฌ์šฉํ•˜๋Š” sync.Once, sync.WaitGroup ์˜ ๊ฒฝ์šฐ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ๋™๊ธฐํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”๋ฐ,

๋†’์€ ์ˆ˜์ค€์˜ ๋™๊ธฐํ™”๋ฅผ ์œ„ํ•ด์„œ๋Š” ์ดํ›„์— ์„ค๋ช…ํ•  ์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ๊ณต์‹๋ฌธ์„œ์—์„œ ๋ฐํžˆ๊ณ  ์žˆ๋‹ค.

mutual exclusion lock : ์ƒํ˜ธ ๋ฐฐ์ œ ์ž ๊ธˆ, ๊ณต์œ  ๋ถˆ๊ฐ€๋Šฅํ•œ ์ž์›์˜ ๋™์‹œ ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜


Channel

์ฑ„๋„์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” ํ†ต๋กœ ์—ญํ• ์„ ํ•˜๋Š” ์ž๋ฃŒ๊ตฌ์กฐ์ด๋‹ค.

์ฑ„๋„์— ๋ฐ์ดํ„ฐ๋ฅผ ๋„ฃ๊ณ  ๋ฝ‘์•„๋‚ด๋Š” ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•˜๋ฉฐ ํ”ํžˆ ์„œ๋กœ ๋‹ค๋ฅธ ๊ณ ๋ฃจํ‹ด ์‚ฌ์ด์— ํ†ต์‹ ์„ ์œ„ํ•ด ์“ฐ์ธ๋‹ค.

Go๋Š” ์ฑ„๋„์„ ๊ธฐ๋ณธ ์ž๋ฃŒํ˜•์œผ๋กœ ์ œ๊ณตํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ํŒจํ‚ค์ง€๋‚˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—†์ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฑ„๋„์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” make ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ,

์ƒ์„ฑ ์‹œ chan ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ํ•ด๋‹น ์ฑ„๋„์—์„œ ์ฃผ๊ณ ๋ฐ›์„ ์ž๋ฃŒํ˜•์„ ์ •์˜ํ•œ๋‹ค.

์ฑ„๋„์€ ๋‚ด๋ถ€์—์„œ ์ˆ˜์‹ ์ž์™€ ์†ก์‹ ์ž๊ฐ€ ์„œ๋กœ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์†์„ฑ์„ ๊ฐ€์ง„๋‹ค.

์ฆ‰ ์†ก์‹  ๊ณ ๋ฃจํ‹ด๊ณผ ์ˆ˜์‹  ๊ณ ๋ฃจํ‹ด์ด ๋™์‹œ์— ๋ณด๋‚ด๊ณ  ๋ฐ›์„ ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Go๋Š” ์ฑ„๋„ ๋ฒ„ํผ๋ง ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋ฒ„ํผ๊ฐ€ ์žˆ๋Š” ์ฑ„๋„์€ ์ฑ„๋„์— ๋ฒ„ํผ ํฌ๊ธฐ๋ฅผ ์ง€์ •ํ•จ์œผ๋กœ์จ ๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“์ฐจ๊ธฐ ์ „๊นŒ์ง€๋Š” ์ˆ˜์‹  ๊ณ ๋ฃจํ‹ด์ด ์ค€๋น„๋˜์ง€ ์•Š์•„๋„

์†ก์‹  ๊ณ ๋ฃจํ‹ด์ด ์ฑ„๋„์— ๋ฏธ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค.

๋”ฐ๋ผ์„œ ์†ก์‹  ๊ณ ๋ฃจํ‹ด์€ ์ˆ˜์‹  ๊ณ ๋ฃจํ‹ด์˜ ์ค€๋น„์—ฌ๋ถ€์™€ ์ƒ๊ด€์—†์ด ๋ฏธ๋ฆฌ ์ „์†กํ•˜๊ณ  ๋‹ค๋ฅธ ์ผ์„ ๋ฐ”๋กœ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ฒ„ํผ๊ฐ€ ์žˆ๋Š” ์ฑ„๋„์ด ์–ธ์ œ๋‚˜ ์ข‹์€ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

๋ฒ„ํผ๊ฐ€ ๊ฐ€๋“ ์ฐฌ ๊ฒฝ์šฐ ์†ก์‹  ๊ณ ๋ฃจํ‹ด์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•œ๋‹ค๋ฉด ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ ๊ณ ๋ฃจํ‹ด ๋™์ž‘์ด ๋ฉˆ์ถฐ๋ฒ„๋ฆฐ๋‹ค.

๊ฒฝ์šฐ์— ๋”ฐ๋ผ์„œ๋Š” ์น˜๋ช…์ ์ธ ๋ฌธ์ œ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—,

์ฒ˜์Œ์—๋Š” ๋ฒ„ํผ๊ฐ€ ์—†๋Š” ์ฑ„๋„๋กœ ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋˜, ํ•„์š”์— ๋”ฐ๋ผ์„œ ๋ฒ„ํผ์˜ ํฌ๊ธฐ๋ฅผ ์กฐ์ ˆํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.


Source

Last updated