đ§ āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ āĻŦāύāĻžāĻŽ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (Concurrency vs Parallelism) â GoLang āĻĒā§āϰā§āĻā§āώāĻŋāϤ
ā§§ āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ (Concurrency)
āϏāĻāĻā§āĻāĻž: āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ āĻšāϞ⧠āĻāĻŽāύ āĻāĻāĻāĻŋ āĻā§āĻļāϞ āϝā§āĻāĻžāύ⧠āĻāĻāĻāĻŋ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻāĻ āϏāĻŽā§ā§ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž (manage) āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤ āĻāĻāĻŋ āĻāĻžāĻāĻā§āϞā§āĻā§ āĻāĻ āύāĻāϤāĻāĻžāĻŦā§ āϏāĻžāĻāĻžāύā§āϰ (structured design) āĻāĻāĻāĻŋ āĻĒāĻĻā§āϧāϤāĻŋāĨ¤
āĻ āϰā§āĻĨāĻžā§, āĻĒā§āϰā§āĻā§āϰāĻžāĻŽ āĻāĻāϏāĻžāĻĨā§ āĻ āύā§āĻ āĻāĻžāĻ āĻļā§āϰ⧠āĻāϰāϤ⧠āĻĒāĻžāϰ⧠āĻāĻŦāĻ āĻĻā§āϰā§āϤ āĻāĻāĻāĻŋāϰ āĻĒāϰ āĻāĻāĻāĻŋ āĻāĻžāĻ āĻāϰ⧠(switch āĻāϰā§) āĻāĻāĻŋā§ā§ āύā§ā§āĨ¤ đ āĻāĻžāĻāĻā§āϞ⧠āĻāĻāĻ āĻŽā§āĻšā§āϰā§āϤ⧠āĻāϞāĻā§āĻ āĻāĻŽāύ āύā§, āĻŦāϰāĻ CPU āĻāĻāĻŦāĻžāϰ⧠āĻāĻāĻāĻŋāĻā§ āĻāĻžāϞāĻŋā§ā§ āĻĻā§āϰā§āϤ āĻ āύā§āϝāĻāĻŋāϤ⧠āϏā§āϝā§āĻāĻ āĻāϰāĻā§āĨ¤
đ§Š āĻāĻĻāĻžāĻšāϰāĻŖ (āϏāĻšāĻāĻāĻžāĻŦā§ āĻŦā§āĻāϤā§)
āĻāĻāĻāύ āĻŦāĻžāĻŦā§āϰā§āĻāĻŋ (Chef) āĻāĻāĻž āϰāĻžāύā§āύāĻž āĻāϰāĻā§āύ:
- āϤāĻŋāύāĻŋ āϏā§āϝā§āĻĒāĻāĻŋ āύā§ā§ā§ āĻĻāĻŋāϞā§āύ,
- āϤāĻžāϰāĻĒāϰ āϏā§āĻāĻž āĻĢā§āĻāϤ⧠āĻĻāĻŋā§ā§ āϏāĻŦāĻāĻŋ āĻāĻžāĻāϤ⧠āĻļā§āϰ⧠āĻāϰāϞā§āύ,
- āĻāĻŋāĻā§āĻā§āώāĻŖ āĻĒāϰ āĻāĻŦāĻžāϰ āϏā§āϝā§āĻĒāĻāĻŋ āύā§ā§ā§ āĻĻāĻŋāϞā§āύāĨ¤
đ āϤāĻŋāύāĻŋ āĻāĻāĻŦāĻžāϰ⧠āĻāĻāĻāĻŋ āĻāĻžāĻ āĻāϰāĻā§āύ, āĻāĻŋāύā§āϤ⧠āĻĻā§āĻāĻŋ āĻāĻžāĻ āĻāύāĻāĻžāϰā§āύā§āĻāϞāĻŋ āĻŽā§āϝāĻžāύā§āĻ āĻāϰāĻā§āύāĨ¤ (āĻāĻāĻāĻŋ āĻā§āϰā§āĻ āϏāĻŽā§āĻāĻŦ, āĻāĻžāϰāĻŖ CPU āĻļā§āϧ⧠context switch āĻāϰāĻā§āĨ¤)
đ§ āĻŽā§āϞ āϧāĻžāϰāĻŖāĻž
- āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ = âāĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻāĻāϏāĻžāĻĨā§ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻžâ
- āĻĢā§āĻāĻžāϏ: Design / Structure
- āϏāĻŋāĻā§āĻā§āϞ āĻā§āϰā§āĻ āϏāĻŽā§āĻāĻŦ
- āĻāύāĻāĻžāϰā§āύā§āĻ āĻā§āĻĄ āĻŽāĻžāύā§āĻ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞ āĻā§āĻĄ āύā§
⧍ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (Parallelism)
āϏāĻāĻā§āĻāĻž: āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ āĻšāϞ⧠āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻāĻāĻ āĻŽā§āĻšā§āϰā§āϤ⧠āĻāĻāϏāĻžāĻĨā§ āϏāĻŽā§āĻĒāĻžāĻĻāύ (execute) āĻāϰāĻžāĨ¤ āĻāĻāĻŋ āĻāϰāĻžāϰ āĻāύā§āϝ āĻāĻāĻžāϧāĻŋāĻ āϏāĻŋāĻĒāĻŋāĻāĻ āĻā§āϰ āĻĒā§āϰā§ā§āĻāύāĨ¤
đ§Š āĻāĻĻāĻžāĻšāϰāĻŖ (āĻŦāĻžāϏā§āϤāĻŦ āĻāĻĻāĻžāĻšāϰāĻŖ)
āϰāĻžāύā§āύāĻžāĻāϰ⧠āĻĻā§āĻāĻāύ āĻŦāĻžāĻŦā§āϰā§āĻāĻŋ āĻāĻā§āύ:
- āĻĒā§āϰāĻĨāĻŽāĻāύ āϏā§āϝā§āĻĒ āύāĻžā§āĻā§āύ
- āĻĻā§āĻŦāĻŋāϤā§ā§āĻāύ āĻāĻāĻ āϏāĻŽā§ā§ āϏāĻŦāĻāĻŋ āĻāĻžāĻāĻā§āύ đ āĻāĻāĻžāύ⧠āĻĻā§āĻāĻŋ āĻāĻžāĻ āĻāĻāĻ āĻŽā§āĻšā§āϰā§āϤ⧠āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋ āĻāϞāĻā§āĨ¤
đ§ āĻŽā§āϞ āϧāĻžāϰāĻŖāĻž
- āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ = âāĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻāĻāĻ āϏāĻŽā§ā§ āϏāĻŽā§āĻĒāύā§āύ āĻāϰāĻžâ
- āĻĢā§āĻāĻžāϏ: Execution / Speed
- āĻāĻāĻžāϧāĻŋāĻ āĻā§āϰ (multi-core CPU) āĻāĻŦāĻļā§āϝāĻ
- āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ āĻĨāĻžāĻāϞā§āĻ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ āύāĻžāĻ āĻĨāĻžāĻāϤ⧠āĻĒāĻžāϰā§, āϤāĻŦā§ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽā§āϰ āĻŽāϧā§āϝ⧠āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ āĻ āĻŦāĻļā§āϝāĻ āĻĨāĻžāĻā§āĨ¤
âī¸ ā§Š āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ āĻŦāύāĻžāĻŽ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (āĻŽā§āϞ āĻĒāĻžāϰā§āĻĨāĻā§āϝ)
| āĻŦā§āĻļāĻŋāώā§āĻā§āϝ | āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ (Concurrency) | āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (Parallelism) |
|---|---|---|
| āϏāĻāĻā§āĻāĻž | āĻāĻāĻ āϏāĻŽā§ā§ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āĻĒāϰāĻŋāĻāĻžāϞāύāĻž āĻāϰāĻž (Managing) | āĻāĻāĻ āĻŽā§āĻšā§āϰā§āϤ⧠āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻāϰāĻž (Executing) |
| āϞāĻā§āώā§āϝ | āĻĒā§āϰā§āĻā§āϰāĻžāĻŽāĻā§ āĻāĻŽāύāĻāĻžāĻŦā§ āϏāĻžāĻāĻžāύ⧠āϝāĻžāϤ⧠āĻ āύā§āĻ āĻāĻžāĻ āĻāĻāϏāĻžāĻĨā§ āϏāĻžāĻŽāϞāĻžāύ⧠āϝāĻžā§ | āĻāĻāĻžāϧāĻŋāĻ āĻā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āĻāϤāĻŋ āĻŦāĻžā§āĻžāύ⧠|
| āĻĢā§āĻāĻžāϏ | Design / Structure | Execution / Performance |
| āĻŦāĻžāϏā§āϤāĻŦāĻžā§āύ | đĨContext SwitchingđĨ (āĻĻā§āϰā§āϤ āĻāĻžāĻ āĻŦāĻĻāϞāĻžāύā§) | āĻāĻāĻ āϏāĻŽā§ā§ āĻāĻŋāύā§āύ āĻā§āϰ⧠āĻāĻžāĻ āĻāĻžāϞāĻžāύ⧠|
| āĻĒā§āϰā§ā§āĻāύ | Single Core āĻšāϞā§āĻ āĻāϞ⧠| đĨMulti-CoređĨ āĻĒā§āϰā§ā§āĻāύ |
| āĻāĻĻāĻžāĻšāϰāĻŖ | āĻāĻāĻāύ āĻŦāĻžāĻŦā§āϰā§āĻāĻŋ āĻĻā§āĻāĻŋ āĻāĻžāĻ āĻāĻĻāϞāĻŦāĻĻāϞ āĻāϰ⧠āĻāϰāĻā§āύ | āĻĻā§āĻāĻāύ āĻŦāĻžāĻŦā§āϰā§āĻāĻŋ āĻāĻāϏāĻžāĻĨā§ āĻĻā§āĻāĻŋ āĻāĻžāĻ āĻāϰāĻā§āύ |
| Go āĻĻā§āώā§āĻāĻŋāϤ⧠| āĻ āύā§āĻāĻā§āϞ⧠goroutine āĻāĻžāϞāĻžāύ⧠| Go scheduler goroutine āĻā§āϞā§āĻā§ āĻāĻāĻžāϧāĻŋāĻ āĻā§āϰ⧠āĻāĻžāĻ āĻāϰāĻā§ |
đĄ āϏāĻāĻā§āώā§āĻĒā§: đ§Š āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ āĻšāϞ⧠āĻĄāĻŋāĻāĻžāĻāύ āĻāĻāĻĄāĻŋā§āĻž (structure)āĨ¤ âī¸ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ āĻšāϞ⧠āϏā§āĻ āĻĄāĻŋāĻāĻžāĻāύā§āϰ āĻŦāĻžāϏā§āϤāĻŦāĻžā§āύ (execution) â āϝāĻāύ āĻāĻāĻžāϧāĻŋāĻ āĻā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§āĨ¤
đ ā§Ē Go (Golang) āĻā§āĻāĻžāĻŦā§ āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ āĻ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ āϏāĻžāĻĒā§āϰā§āĻ āĻāϰā§?
Go Language āĻāύāĻāĻžāϰā§āύā§āϏāĻŋāϰ āĻāύā§āϝāĻ āĻĄāĻŋāĻāĻžāĻāύ āĻāϰāĻž āĻšā§ā§āĻā§, āĻāĻŦāĻ āĻāϰ āĻā§āϤāϰ⧠āĻāĻŽāύ runtime āĻāĻā§ āϝāĻž āĻāĻā§ āϏāĻšāĻā§ parallel āĻāϰāϤ⧠āĻĒāĻžāϰā§āĨ¤
āĻ. đ§ĩ Goroutines â āĻāύāĻāĻžāϰā§āύā§āϏāĻŋāϰ āĻŽā§āϞ āĻāĻŋāϤā§āϤāĻŋ
- Goroutine āĻšāϞ⧠Go-āĻāϰ āĻāύāĻāĻžāϰā§āύā§āϏāĻŋāϰ āĻŽā§āϞ āĻ āϏā§āϤā§āϰāĨ¤ āĻāĻāĻŋ āĻāĻāĻāĻŋ āĻĢāĻžāĻāĻļāύ āϝāĻž āĻ āύā§āϝāĻžāύā§āϝ āĻĢāĻžāĻāĻļāύā§āϰ āĻĒāĻžāĻļāĻžāĻĒāĻžāĻļāĻŋ āĻāϞāϤ⧠āĻĒāĻžāϰā§āĨ¤
- Goroutine āĻšāϞ⧠Go-āĻāϰ lightweight threadāĨ¤ āĻāĻā§āϞ⧠āĻ āĻĒāĻžāϰā§āĻāĻŋāĻ āϏāĻŋāϏā§āĻā§āĻŽā§āϰ āĻĨā§āϰā§āĻĄā§āϰ āĻā§ā§ā§ āĻ āύā§āĻ āĻāĻŽ āĻŽā§āĻŽāϰāĻŋ āύā§ā§, āϤāĻžāĻ āĻāĻĒāύāĻŋ āĻāĻāĻāĻŋ Go āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§ āϞāĻā§āώ āϞāĻā§āώ āĻā§āϰā§āĻāĻŋāύ āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
- āĻĒā§āϰāϤāĻŋāĻāĻŋ goroutine āĻļā§āϰā§āϤ⧠āĻĒā§āϰāĻžā§ 2KB stack memory āύā§ā§ â OS āĻĨā§āϰā§āĻĄā§āϰ āϤā§āϞāύāĻžā§ āĻ āϤāĻŋ āĻā§āώā§āĻĻā§āϰāĨ¤
goāĻā§āĻā§āĻžāϰā§āĻĄ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āϝā§āĻā§āύ⧠āĻĢāĻžāĻāĻļāύāĻā§ goroutine āĻšāĻŋāϏā§āĻŦā§ āĻāĻžāϞāĻžāύ⧠āϝāĻžā§āĨ¤- Go runtime āύāĻŋāĻā§āĻ āĻāĻā§āϞ⧠āĻŽā§āϝāĻžāύā§āĻ āĻāϰā§, āϤāĻžāĻ āĻāĻĒāύāĻŋ āϏāĻšāĻā§āĻ āĻšāĻžāĻāĻžāϰ āĻŦāĻž āϞāĻā§āώāĻžāϧāĻŋāĻ goroutine āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰāĻŦā§āύāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ:
package main
import (
"fmt"
"time"
)
func cookSoup() {
for i := 0; i < 5; i++ {
fmt.Println("đĨŖ Cooking soup...", i)
time.Sleep(time.Millisecond * 500)
// Each iteration waits 500 milliseconds before continuing
}
}
func chopVeg() {
for i := 0; i < 5; i++ {
fmt.Println("đĒ Chopping vegetables...", i)
time.Sleep(time.Millisecond * 400)
// Each iteration waits 400 milliseconds before continuing
}
}
func main() {
// run concurrently
// context switching
// youâre starting a goroutine (a lightweight concurrent thread)
go cookSoup()
// run concurrently
// context switching
// youâre starting a goroutine (a lightweight concurrent thread)
go chopVeg()
// So now both functions start running concurrently, in separate goroutines.
time.Sleep(time.Second * 3)
fmt.Println("â
All tasks managed concurrently!")
}đ āĻāĻ āĻā§āĻĄā§ āĻĻā§āĻāĻŋ āĻĢāĻžāĻāĻļāύ āĻāĻāĻāϏāĻžāĻĨā§ āĻāϞāϤ⧠āĻĻā§āĻāĻž āϝāĻžāĻŦā§ â āĻāĻāĻŋ āĻāύāĻāĻžāϰā§āύā§āϏāĻŋāĨ¤
đ§Š main() function
func main() {
go cookSoup() // run concurrently
go chopVeg() // run concurrently
time.Sleep(time.Second * 3)
fmt.Println("â
All tasks managed concurrently!")
}Hereâs the key:
- When you write
go cookSoup()â youâre starting a goroutine (a lightweight concurrent thread). - Same for
go chopVeg().
So now both functions start running concurrently, in separate goroutines.
đ Why you need time.Sleep() in main()
If you remove this line:
time.Sleep(time.Second * 3)Then the main function finishes immediately â and your program exits before goroutines can print anything.
đ Reason:
When the main() function ends, the entire Go program stops, even if goroutines are still running.
So the goroutines (cookSoup and chopVeg) are killed before they have a chance to output anything.
Thatâs why you donât see any output if you remove the Sleep() in main.
â Better way than Sleep()
Using time.Sleep just to keep the main function alive isnât ideal. A more professional and controlled way is to use a sync.WaitGroup.
āĻ. đ Channels â āύāĻŋāϰāĻžāĻĒāĻĻ āϝā§āĻāĻžāϝā§āĻ āĻŦā§āϝāĻŦāϏā§āĻĨāĻž
Goroutine āĻā§āϞ⧠āϏā§āĻŦāĻžāϧā§āύāĻāĻžāĻŦā§ āĻāϞā§, āϤāĻžāĻ āϤāĻžāĻĻā§āϰ āĻŽāϧā§āϝ⧠āϤāĻĨā§āϝ āĻāĻĻāĻžāύ-āĻĒā§āϰāĻĻāĻžāύ āĻŦāĻž āϏāĻŋāĻā§āĻā§āϰā§āύāĻžāĻāĻā§āĻļāύā§āϰ (Sync) āĻāύā§āϝ āĻĻāϰāĻāĻžāϰ āĻšā§ āĻāĻāĻāĻŋ safe communication mechanismāĨ¤
Channel āĻšāĻā§āĻā§ āϏā§āĻ āύāĻŋāϰāĻžāĻĒāĻĻ āĻĒāĻžāĻāĻĒāϞāĻžāĻāύ, āϝā§āĻāĻžāύā§:
- āĻāĻ Goroutine āϤāĻĨā§āϝ āĻĒāĻžāĻ āĻžā§ (
chan <-) - āĻ
āύā§āϝ Goroutine āϤāĻĨā§āϝ āĻā§āϰāĻšāĻŖ āĻāϰ⧠(
<- chan)
channel āĻĻāĻŋā§ā§ āĻā§āϰā§āĻāĻŋāύāĻā§āϞ⧠āĻāĻā§ āĻ āĻĒāϰā§āϰ āϏāĻžāĻĨā§ âāĻāĻĨāĻž āĻŦāϞā§âāĨ¤
āĻāĻĻāĻžāĻšāϰāĻŖ:
package main
import "fmt"
func worker(ch chan string) {
msg := <-ch
fmt.Println("đĨ Received:", msg)
}
func main() {
ch := make(chan string)
go worker(ch)
ch <- "Hello from main goroutine!"
}đ Channels āĻĄā§āĻāĻž āϰā§āϏ (data race) āĻā§āĻžāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰ⧠āĻāĻŦāĻ āĻāύāĻāĻžāϰā§āύā§āĻ āĻĒā§āϰā§āĻā§āϰāĻžāĻŽā§āϰ āϏāĻžāϧāĻžāϰāĻŖ āϏāĻŽāϏā§āϝāĻžāĻā§āϞ⧠āĻā§āĻžāϤ⧠āϏāĻžāĻšāĻžāϝā§āϝ āĻāϰ⧠āĻāĻŦāĻ āĻā§āĻĄāĻā§ āϏāĻŋāĻā§āĻā§āϰā§āύāĻžāĻāĻ āϰāĻžāĻā§āĨ¤
āĻ. âī¸ Go Runtime Scheduler - āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽā§āϰ āĻāύā§āϝ
-
Go-āĻāϰ āĻā§āϤāϰ⧠āĻāĻāĻāĻŋ âāĻŽā§āϝāĻžāύā§āĻāĻžāϰâ (āϝāĻžāĻā§ Runtime Scheduler āĻŦāϞā§) āĻāĻā§āĨ¤
-
āĻāĻĒāύāĻŋ āϝāĻāύ āĻ āύā§āĻāĻā§āϞ⧠āĻā§āϰā§āĻāĻŋāύ (āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ) āĻāĻžāϞ⧠āĻāϰā§āύ, āĻāĻ āĻŽā§āϝāĻžāύā§āĻāĻžāϰāĻāĻŋ āĻāĻĒāύāĻžāϰ āĻāĻŽā§āĻĒāĻŋāĻāĻāĻžāϰ⧠āϝāϤāĻā§āϞ⧠āϏāĻŋāĻĒāĻŋāĻāĻ āĻā§āϰ (āϝā§āĻŽāύ: ā§ĒāĻāĻŋ, ā§ŽāĻāĻŋ) āĻāĻā§, āϏā§āĻā§āϞā§āϰ āĻāĻĒāϰ āĻā§āϰā§āĻāĻŋāύāĻā§āϞā§āĻā§ āĻāĻžāĻ āĻāϰ⧠āĻĻā§ā§āĨ¤
-
āĻĢāϞā§, āĻāĻĒāύāĻžāϰ āϝāĻĻāĻŋ ā§ĒāĻāĻŋ āĻā§āϰ āĻĨāĻžāĻā§, Go āĻāĻāĻ āϏāĻŽā§ā§ ā§ĒāĻāĻŋ āĻā§āϰā§āĻāĻŋāύāĻā§ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋ (āĻāĻāĻ āĻŽā§āĻšā§āϰā§āϤā§) āĻāĻžāϞāĻžāϤ⧠āĻĒāĻžāϰā§āĨ¤
-
āĻāĻ scheduler M:N āĻŽāĻĄā§āϞ āĻ āύā§āϏāϰāĻŖ āĻāϰā§:
- M = OS āĻĨā§āϰā§āĻĄ
- N = Goroutines
- Scheduler goroutine āĻā§āϞā§āĻā§ available OS thread-āĻ āĻŽā§āϝāĻžāĻĒ āĻāϰā§āĨ¤
āĻŽā§āϞ āύāĻŋā§āύā§āϤā§āϰāĻŖ āĻĢāĻžāĻāĻļāύ:
import "runtime"
runtime.GOMAXPROCS(n) // n āϏāĻāĻā§āϝāĻ CPU āĻā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āύāĻŋāϰā§āϧāĻžāϰāĻŖ āĻāϰā§āϝāĻĻāĻŋ runtime.GOMAXPROCS(runtime.NumCPU()) āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰāĻž āĻšā§,
āϤāĻŦā§ Go runtime āϏāĻŦ āĻā§āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠â āĻ
āϰā§āĻĨāĻžā§ Parallel Execution āĻšā§āĨ¤
āϏāĻžāϰāϏāĻāĻā§āώā§āĻĒ: â¤ī¸ āĻāĻĒāύāĻŋ Go-āϤ⧠āĻā§āϰā§āĻāĻŋāύ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻāϰ⧠āĻāύāĻāĻžāϰā§āύā§āĻ āĻā§āĻĄ āϞā§āĻā§āύ, āĻāϰ Go-āĻāϰ āϰāĻžāύāĻāĻžāĻāĻŽ āϏāĻŋāĻĄāĻŋāĻāϞāĻžāϰ āϏā§āĻ āĻā§āĻĄāĻā§ āĻāĻāĻžāϧāĻŋāĻ āϏāĻŋāĻĒāĻŋāĻāĻ āĻā§āϰ⧠āĻā§āĻŋā§ā§ āĻĻāĻŋā§ā§ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ āĻ āϰā§āĻāύ āĻāϰā§āĨ¤ â¤ī¸
đ§Š ā§Ģī¸ āϏāĻžāϧāĻžāϰāĻŖ āĻā§āϞ āϧāĻžāϰāĻŖāĻž
| āĻā§āϞ āϧāĻžāϰāĻŖāĻž | āĻŦāĻžāϏā§āϤāĻŦāϤāĻž |
|---|---|
| Go inherently parallel | āύāĻž, Go inherently concurrentāĨ¤ Parallel execution āύāĻŋāϰā§āĻāϰ āĻāϰ⧠CPU āĻā§āϰā§āϰ āϏāĻāĻā§āϝāĻž āĻ scheduler-āĻāϰ āĻāĻĒāϰāĨ¤ |
| āϏāĻŦ goroutine āĻāĻāϏāĻžāĻĨā§ āĻāϞ⧠| āύāĻž, scheduler āϏāĻŽā§ āĻāĻžāĻ āĻāϰ⧠āĻĻā§ā§ (context switch āĻāϰā§)āĨ¤ |
| Channel āĻāĻžā§āĻž concurrency āĻāϰāĻž āϝāĻžā§ āύāĻž | āϏāĻŽā§āĻāĻŦ, āϤāĻŦā§ channels āĻā§āĻĄāĻā§ āύāĻŋāϰāĻžāĻĒāĻĻ āĻ āĻĒāϰāĻŋāώā§āĻāĻžāϰ āϰāĻžāĻā§āĨ¤ |
đ§ ā§Ŧī¸ āϏāĻžāϰāϏāĻāĻā§āώā§āĻĒ
| āĻŦāĻŋāώ⧠| āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ | āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ |
|---|---|---|
| āĻŽāĻžāύ⧠| āĻāĻāĻ āϏāĻŽā§ā§ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ manage | āĻāĻāĻ āϏāĻŽā§ā§ āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ execute |
| Go-āϤ⧠āĻŽāĻžāϧā§āϝāĻŽ | Goroutine | Runtime Scheduler |
| āϝā§āĻāĻžāϝā§āĻ | Channels | Shared memory āĻŦāĻž channels |
| āĻĒā§āϰā§ā§āĻāύā§ā§ CPU āĻā§āϰ | ā§§āĻāĻŋ āĻšāϞā§āĻ āĻāϞ⧠| ⧍ āĻŦāĻž āϤāĻžāϰ āĻŦā§āĻļāĻŋ āĻā§āϰ āĻĒā§āϰā§ā§āĻāύ |
| āĻĢā§āĻāĻžāϏ | Design / Structure | Execution / Performance |
đŖī¸ âConcurrency is about dealing with lots of things at once. Parallelism is about doing lots of things at once.â â Rob Pike (Go-āĻāϰ āϏāĻš-āύāĻŋāϰā§āĻŽāĻžāϤāĻž)
đ ā§ āĻŦāĻžāϏā§āϤāĻŦ āĻĒā§āϰā§ā§āĻ
-
Concurrency:
- āĻā§ā§āĻŦ āϏāĻžāϰā§āĻāĻžāϰ āϝā§āĻāĻžāύ⧠āĻ āύā§āĻ āĻā§āϞāĻžā§ā§āύā§āĻ āĻāĻāϏāĻžāĻĨā§ āϰāĻŋāĻā§ā§ā§āϏā§āĻ āĻāϰāĻā§āĨ¤
- āĻĄā§āĻāĻž āϏā§āĻā§āϰāĻŋāĻŽ āĻĒā§āϰāϏā§āϏāĻŋāĻāĨ¤
-
Parallelism:
- CPU-āĻŦāĻžāĻāύā§āĻĄ āĻāĻžāĻ (āϝā§āĻŽāύ: āĻāĻŽā§āĻ āĻĒā§āϰāϏā§āϏāĻŋāĻ, āĻŦā§ āĻāĻŽā§āĻĒāĻŋāĻāĻā§āĻļāύ)
- āĻĄā§āĻāĻž āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞ āĻāĻžāϏā§āĻ (MapReduce, Matrix Multiplication āĻāϤā§āϝāĻžāĻĻāĻŋ)
đ ā§Žī¸ āϏāĻāĻā§āώāĻŋāĻĒā§āϤ āϰāĻŋāĻā§āϝāĻžāĻĒ
| āĻŦāĻŋāώ⧠| āĻŽā§āϞ āĻĒā§ā§āύā§āĻ |
|---|---|
| āĻāύāĻāĻžāϰā§āύā§āϏāĻŋ | āĻĄāĻŋāĻāĻžāĻāύ āĻā§āĻļāϞ (āĻāĻāĻžāϧāĻŋāĻ āĻāĻžāĻ āϏāĻžāĻŽāϞāĻžāύā§) |
| āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ | āĻāĻāĻžāϧāĻŋāĻ āĻā§āϰ⧠āĻāĻāϏāĻžāĻĨā§ āĻāĻžāϞāĻžāύ⧠|
| Go concurrency āĻā§āϞ | Goroutines + Channels |
| Parallelism control | Runtime Scheduler + GOMAXPROCS |
| āĻŽā§āϞ āĻāĻā§āϤāĻŋ | âConcurrency â Parallelismâ |