goroutine
๊ธฐ๋ณธ์ ๋ณด
์ฐ๋ ๋
ํ๋ก์ธ์ค
๊ณ ๋ฃจํด
๊ณ ๋ฃจํด์ ๊ฒฝ๋ ์ฐ๋ ๋๋ก ํจ์๋ ๋ช ๋ น์ ๋์์ ์คํํ ๋ ์ฌ์ฉํฉ๋๋ค.
๊ณ ๋ฃจํด์ os ์ฐ๋ ๋๋ฅผ ์ด์ฉํ๋ ๊ฒฝ๋ ์ฐ๋ ๋ ์ด๋ค.
์ปจํ ์คํธ ์ค์์นญ : ์ฐ๋ ๋ ์ ํ์๋ ๋น์ฉ์ด ๋ฐ์ํ๋ค. ์ด๊ฒ์ ์ปจํ ์คํธ ์ค์์นญ์ด๋ผ๊ณ ํ๋ค.
๋ณดํต ์ฝ์ด ๊ฐฏ์์ ๋๋ฐฐ์ด์ ์ค๋ ๋๋ฅผ ๋ง๋ค๋ฉด ์ค์์นญ ๋น์ฉ์ด ๋ง์ด ๋ฐ์ํ๋ค๊ณ ํฉ๋๋ค.
๋ง์ฝ ์ฐ๋ ๋ ๊ฐฏ์์ ์ฝ์ด ๊ฐฏ์๊ฐ ๊ฐ๋ค๋ช ์ด๋ป๊ฒ ๋ ๊ฐ?
CPU ์ฝ์ด๋ง๋ค OS ์ฐ๋ ๋๋ฅผ ํ๋๋ง ํ ๋นํด์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ์ด ๋ฐ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ด ์ข๋ค.
๋ฉ์ธ ํจ์๋ ๊ณ ๋ฃจํด - ๋ฉ์ธ ๊ณ ๋ฃจํด์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค.
์๋ก์ด ๊ณ ๋ฃจํด์ ๋จ์ํ go ํจ์
๋ก ๋ง๋ ๋ค.
package main
import (
"fmt"
"time"
)
func PrintHangul() {
hanguls := []rune{'๊ฐ', '๋', '๋ค', '๋ผ', '๋ง', '๋ฐ', '์ฌ'}
for _, v := range hanguls {
time.Sleep(300 * time.Millisecond)
fmt.Printf("%c ", 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)
}
๋ฉ์ธ ํจ์๊ฐ ์ข ๋ฃ๋๋ฉด ์๋ฌด๋ฆฌ ๋ง์ ๊ณ ๋ฃจํด์ด ์์ฑ๋์ด ์๋๋ผ๋ ๋ชจ๋ ์ฆ์ ์ข ๋ฃ๋๊ณ ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ฉ๋๋ค.
์๋ธ ๊ณ ๋ฃจํ
์ด ์ข
๋ฃ๋ ๋๊น์ง ๊ธฐ๋ค๋ฆฌ๊ธฐ
sync ํจํค์ง์ WaitGroup๋ฅผ ์ฌ์ฉํ๋ฉด๋ฉ๋๋ค.
var wg sync.WaitGroup
wg.Add(3)
wg.Done()
wg.Wait()
package main
import (
"fmt"
"sync"
)
var wg sync.WaitGroup // โถ waitGroup ๊ฐ์ฒด
func SumAtoB(a, b int) {
sum := 0
for i := a; i <= b; i++ {
sum += i
}
fmt.Printf("%d๋ถํฐ %d๊น์ง ํฉ๊ณ๋ %d์
๋๋ค.\n", a, b, sum)
wg.Done()
}
func main() {
wg.Add(10) // โท ์ด ์์
๊ฐ์ ์ค์
for i := 0; i < 10; i++ {
go SumAtoB(1, 1000000000)
}
wg.Wait() // โน ๋ชจ๋ ์์
์ด ์๋ฃ๋๊ธธ ๊ธฐ๋ค๋ฆผ.
fmt.Println("๋ชจ๋ ๊ณ์ฐ์ด ์๋ฃ๋์์ต๋๋ค.")
}
์ฐ๋ ๋ ํ์ฒ๋ผ ๋์ํ๋๋ฏ. ์ฌ๋ฌ๊ฐ์ ์ฝ์ด๋ฅผ ๊ฐ์ด ์ธ์๊ฐ ์๊ฒ ๋๊ฒ์ os ์ฐ๋ ๋๋๊น.
์ฝ์ด๊ฐ 2๊ฐ๊ณ ๊ณ ๋ฃจํด์ด 3๊ฐ๋ฉด 3๋ฒ์งธ ๊ณ ๋ฃจํด์ ๋๊ธฐํ๋ค. ๊ณ ๋ฃจํด์ด ํ๋๊ฐ ๋๋๋ฉด ๊ฑฐ๊ธฐ์ 3๋ฒ์งธ์ ๋ฃ์ด์ค๋ค.
๋๊ธฐํ๋๊ฒ ๋ง์์ง๋ฉด?? ๋ณดํต ๋๊ธฐ๋ฅผ ๋ง์ดํ๋ค.
์์คํ
์ฝ ํธ์ถ์
์์คํ ์ฝ์ด๋ ์ด์์ฒด์ ๊ฐ ์ง์ํ๋ ์๋น์ค๋ฅผ ํธ์ถํ ๋๋ ๋งํฉ๋๋ค.
๋ํ์ ์ผ๋ก ๋คํธ์ํฌ / ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ ๋ฑ์ด ์์ต๋๋ค.
์ด๋ ๋๊ธฐ์ํ๋ก ๋ค์ด๊ฐ๋ค. ๊ทธ๋ ๋๊ธฐ์ค์ธ ๊ณ ๋ฃจํด๊ณผ ๊ต์ฒด๊ฐ ๋๋ค.
์๋ฌด๋ฆฌ ๋ง์ ๊ณ ๋ฃจํด์ ์์ฑํด๋ OS ๋จ์์ ์ปจํ ์คํธ ์ค์์นญ ๋น์ฉ์ด ๋ฐ์ํ์ง ์๋๋ค.
์ฌ์ค ๊ณ ๋ฃจํด์ด ๊ต์ฒด๋๋๊ฒ๋ ์ปจํ ์คํธ ์ค์์นญ์ด๋ค. ์ด๋ ์ฌ์ฉ๋๋ ์ปจํ ์คํธ๊ฐ os ์ปจํ ์คํธ ๋ณด๋ค ์คํ์ด ์๋ค.
๋์์ฑ ํ๋ก๊ทธ๋๋ฐ ์ฃผ์์
๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์์ ์ฌ๋ฌ ๊ณ ๋ฃจํด์์ ์ ๊ทผํ ๋ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
๋ฎคํ
์ค (์ํธ๋ฐฐ์ )๋ฅผ ์ด์ฉํ ๋์์ฑ ๋ฌธ์ ํด๊ฒฐ
๋ฝ์ ๊ฑธ์ด์ ๋ฉ๋ชจ๋ฆฌ ์์์ ํ๋์ ๊ณ ๋ฃจํด์์๋ง ์ ๊ทผํ๊ฒ ํด์ผํ๋ค.
์ํธ๋ฐฐ์ ๋ฐฉ๋ฒ์ผ๋ก๋ Mutex, Semaphore ๋ฐฉ์์ด ์ฌ์ฉ๋๋ค. java์์ Synchronized ์ธ๊ฐ?
defer๋ฅผ ์ฌ์ฉ
//ch24/ex24.4/ex24.4.go
package main
import (
"fmt"
"sync"
"time"
)
var mutex sync.Mutex // โถ ํจํค์ง ์ ์ญ ๋ณ์ ๋ฎคํ
์ค
type Account struct {
Balance int
}
func DepositAndWithdraw(account *Account) {
mutex.Lock() // โท ๋ฎคํ
์ค ํ๋
defer mutex.Unlock() // โธ defer๋ฅผ ์ฌ์ฉํ Unlock()
if account.Balance < 0 {
panic(fmt.Sprintf("Balance should not be negative value: %d", account.Balance))
}
account.Balance += 1000
time.Sleep(time.Millisecond)
account.Balance -= 1000
}
func main() {
var wg sync.WaitGroup
account := &Account{0}
wg.Add(10)
for i := 0; i < 10; i++ {
go func() {
for {
DepositAndWithdraw(account)
}
wg.Done()
}()
}
wg.Wait()
}
๊น๋ฐ์ ๊ฝ์ ๋์ด ์..
crtl+r
๋ก ํ๋ก๊ทธ๋จ ๊ฐ์ ์ข
๋ฃ
๋ฎคํ
์ค์ ๋ฌธ์ ์
๋์์ฑ ํ๋ก๊ทธ๋ง์ผ๋ก ์ธ์ ์ฑ๋ฅ ํฅ์์ ์ป์์ ์๋ค. ์ฌ์ง์ด ๊ณผ๋ํ ๋ฝํน์ผ๋ก ์ฑ๋ฅ์ด ํ๋ฝ๋๊ธฐ๋ ํ๋ค.
๊ณ ๋ฃจํด์ ์์ ํ ๋ฉ์ถ๊ฒ ๋ง๋๋ ๋ฐ๋๋ฝ ๋ฌธ์ ๋ฐ์ (์ฒ์์๋ ์ ์๋ณด์..๋ฐ๋๋ฝ..)
๋ฐ๋๋ฝ์ ์ฃผ์ํฉ์๋ค.
๋ฎคํ
์ค ๊ฒฐ๋ก
๋ฉํฐ์ฝ์ด ์ปดํจํฐ์์๋ ์ฌ๋ฌ ๊ณ ๋ฃจํด์ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ์ ํฅ์์ํฌ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฌ๋ฌ ๊ณ ๋ฃจํ ใ ์ด ์ ๊ทผํ๋ฉด ํ๋ก๊ทธ๋จ์ด ๊ผฌ์ผ์ ์์ต๋๋ค.
๋ฎคํ ์ค๋ฅผ ์ด์ฉํ๋ฉด ๋์์ ๊ณ ๋ฃจํด ํ๋๋ง ์ ๊ทผํ๋๋ก ์กฐ์ ํด ๊ผฌ์ด๋ ๋ฌธ์ ๋ฅผ ๋ง์ ์ ์๋ค.
๊ทธ๋ฌ๋ ๋ฎคํ ์ค๋ฅผ ์๋ชป ์ฌ์ฉํ๋ฉด ์ฑ๋ฅํฅ์๋ ๋ฐ๋๋ฝ์ด๋ผ๋ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ์๊ธธ์ ์์ต๋๋ค.
๋ฎคํ ์ค๋ ๋งค์ฐ ์กฐ์ฌํ ์ฌ์ฉํด์ผํ๋ค. ๊ทธ๋ผ ์์ ์ฌ์ฉํ์ง ๋ง๊ฐ? ๊ทธ๊ฑด ์๋๋ผ๊ณ ํจ. ๊ฐ์ฅ ์ฌํํ๊ฒ ์ฌ์ฉํ ์ ์์...๋์ ์กฐ์ฌํ์ฌ...
๋ฎคํ ์ค๋ฅผ ์ฐ์ง ์์์ผ ํ ๊น์? ๋ฎคํ ์ค๊ฐ ๊ณ ์ด์ง ์๋๋ก ์ข์ ๋ฒ์์์ ๋ฐ๋๋ฝ์ ๊ฑธ๋ฆฌ์ง ์๋์ง ์ฒ ์ ํ ํ์ธํด์ ์ฌ์ฉํ๋ฉด ์ฌ์ ํ ์ ์ฉํ๊ณ ์์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค.
๋๋ค๋ฅธ ์์ ๊ด๋ฆฌ ๊ธฐ๋ฒ (๋ฎคํ
์ค๋ฅผ ์ฌ์ฉํ์ง ์๊ณ )
์์ญ์ ๋๋๋ ๋ฐฉ๋ฒ - ์๋ก ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฐ๋ก ๊ด๋ฆฌํ๋ฉด๋จ.
์ญํ ์ ๋๋๋ ๋ฐฉ๋ฒ - ์ฑ๋
Last updated
Was this helpful?