Goroutine
September 27th, 2022

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 ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ์™€ ํ•จ๊ป˜ ํ•ด๋‹น ์ฑ„๋„์—์„œ ์ฃผ๊ณ ๋ฐ›์„ ์ž๋ฃŒํ˜•์„ ์ •์˜ํ•œ๋‹ค.

c1 := make(chan int) // ์ƒˆ ์ •์ˆ˜์ฑ„๋„ c1
var chan int c2 = c1 // ์ƒˆ ์ฑ„๋„ ๋ณ€์ˆ˜ c2์— c1๋ฅผ ํ• ๋‹น
var chan<- int c3 = c1 // send ์ „์šฉ ์ฑ„๋„ c3
var <-chan int c4 = c1 // receive ์ „์šฉ ์ฑ„๋„ c4

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

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

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

package main

import "fmt"

func main() {
	c := make(chan int, 5) // ๋ฒ„ํผ๊ฐ€ 5์ธ ์ •์ˆ˜ํ˜• ์ฑ„๋„ 

	go func() {
		c <- 111
		c <- 222
		c <- 333
	}()

	i := <-c
	fmt.Println(i)
}

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

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

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

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

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

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

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


Source

Subscribe to Primrose
Receive the latest updates directly to your inbox.
Nft graphic
Mint this entry as an NFT to add it to your collection.
Verification
This entry has been permanently stored onchain and signed by its creator.
More from Primrose

Skeleton

Skeleton

Skeleton