Skip to Content
Go Realm v1 is released 🎉
Go RoutinesConcurrency vs Parallelism

🧠 āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ āĻŦāύāĻžāĻŽ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (Concurrency vs Parallelism) — GoLang āĻĒā§āϰ⧇āĻ•ā§āώāĻŋāϤ


ā§§ āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ (Concurrency)

āϏāĻ‚āĻœā§āĻžāĻž: āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ āĻšāϞ⧋ āĻāĻŽāύ āĻāĻ•āϟāĻŋ āĻ•ā§ŒāĻļāϞ āϝ⧇āĻ–āĻžāύ⧇ āĻāĻ•āϟāĻŋ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻāĻ•āχ āϏāĻŽā§Ÿā§‡ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻžāϜ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž (manage) āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇āĨ¤ āĻāϟāĻŋ āĻ•āĻžāϜāϗ⧁āϞ⧋āϕ⧇ āĻ—āĻ āύāĻ—āϤāĻ­āĻžāĻŦ⧇ āϏāĻžāϜāĻžāύ⧋āϰ (structured design) āĻāĻ•āϟāĻŋ āĻĒāĻĻā§āϧāϤāĻŋāĨ¤

āĻ…āĻ°ā§āĻĨāĻžā§Ž, āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽ āĻāĻ•āϏāĻžāĻĨ⧇ āĻ…āύ⧇āĻ• āĻ•āĻžāϜ āĻļ⧁āϰ⧁ āĻ•āϰāϤ⧇ āĻĒāĻžāϰ⧇ āĻāĻŦāĻ‚ āĻĻā§āϰ⧁āϤ āĻāĻ•āϟāĻŋāϰ āĻĒāϰ āĻāĻ•āϟāĻŋ āĻ•āĻžāϜ āĻ•āϰ⧇ (switch āĻ•āϰ⧇) āĻāĻ—āĻŋā§Ÿā§‡ āĻ¨ā§‡ā§ŸāĨ¤ 👉 āĻ•āĻžāϜāϗ⧁āϞ⧋ āĻāĻ•āχ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇ āϚāϞāϛ⧇āχ āĻāĻŽāύ āύ⧟, āĻŦāϰāĻ‚ CPU āĻāĻ•āĻŦāĻžāϰ⧇ āĻāĻ•āϟāĻŋāϕ⧇ āϚāĻžāϞāĻŋā§Ÿā§‡ āĻĻā§āϰ⧁āϤ āĻ…āĻ¨ā§āϝāϟāĻŋāϤ⧇ āĻ¸ā§āϝ⧁āχāϚ āĻ•āϰāϛ⧇āĨ¤


🧩 āωāĻĻāĻžāĻšāϰāĻŖ (āϏāĻšāϜāĻ­āĻžāĻŦ⧇ āĻŦ⧁āĻāϤ⧇)

āĻāĻ•āϜāύ āĻŦāĻžāĻŦ⧁āĻ°ā§āϚāĻŋ (Chef) āĻāĻ•āĻž āϰāĻžāĻ¨ā§āύāĻž āĻ•āϰāϛ⧇āύ:

  1. āϤāĻŋāύāĻŋ āĻ¸ā§āϝ⧁āĻĒāϟāĻŋ āĻ¨ā§‡ā§œā§‡ āĻĻāĻŋāϞ⧇āύ,
  2. āϤāĻžāϰāĻĒāϰ āϏ⧇āϟāĻž āĻĢ⧁āϟāϤ⧇ āĻĻāĻŋā§Ÿā§‡ āϏāĻŦāϜāĻŋ āĻ•āĻžāϟāϤ⧇ āĻļ⧁āϰ⧁ āĻ•āϰāϞ⧇āύ,
  3. āĻ•āĻŋāϛ⧁āĻ•ā§āώāĻŖ āĻĒāϰ āφāĻŦāĻžāϰ āĻ¸ā§āϝ⧁āĻĒāϟāĻŋ āĻ¨ā§‡ā§œā§‡ āĻĻāĻŋāϞ⧇āύāĨ¤

👉 āϤāĻŋāύāĻŋ āĻāĻ•āĻŦāĻžāϰ⧇ āĻāĻ•āϟāĻŋ āĻ•āĻžāϜ āĻ•āϰāϛ⧇āύ, āĻ•āĻŋāĻ¨ā§āϤ⧁ āĻĻ⧁āϟāĻŋ āĻ•āĻžāϜ āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϟāϞāĻŋ āĻŽā§āϝāĻžāύ⧇āϜ āĻ•āϰāϛ⧇āύāĨ¤ (āĻāĻ•āϟāĻŋ āϕ⧋āϰ⧇āχ āϏāĻŽā§āĻ­āĻŦ, āĻ•āĻžāϰāĻŖ CPU āĻļ⧁āϧ⧁ context switch āĻ•āϰāϛ⧇āĨ¤)


🧠 āĻŽā§‚āϞ āϧāĻžāϰāĻŖāĻž

  • āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ = “āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻžāϜ āĻāĻ•āϏāĻžāĻĨ⧇ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻžâ€
  • āĻĢā§‹āĻ•āĻžāϏ: Design / Structure
  • āϏāĻŋāĻ™ā§āϗ⧇āϞ āϕ⧋āϰ⧇āĻ“ āϏāĻŽā§āĻ­āĻŦ
  • āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϟ āϕ⧋āĻĄ āĻŽāĻžāύ⧇āχ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞ āϕ⧋āĻĄ āύ⧟

⧍ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (Parallelism)

āϏāĻ‚āĻœā§āĻžāĻž: āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ āĻšāϞ⧋ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻžāϜ āĻāĻ•āχ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇ āĻāĻ•āϏāĻžāĻĨ⧇ āϏāĻŽā§āĻĒāĻžāĻĻāύ (execute) āĻ•āϰāĻžāĨ¤ āĻāϟāĻŋ āĻ•āϰāĻžāϰ āϜāĻ¨ā§āϝ āĻāĻ•āĻžāϧāĻŋāĻ• āϏāĻŋāĻĒāĻŋāχāω āϕ⧋āϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāύāĨ¤


🧩 āωāĻĻāĻžāĻšāϰāĻŖ (āĻŦāĻžāĻ¸ā§āϤāĻŦ āωāĻĻāĻžāĻšāϰāĻŖ)

āϰāĻžāĻ¨ā§āύāĻžāϘāϰ⧇ āĻĻ⧁āχāϜāύ āĻŦāĻžāĻŦ⧁āĻ°ā§āϚāĻŋ āφāϛ⧇āύ:

  • āĻĒā§āϰāĻĨāĻŽāϜāύ āĻ¸ā§āϝ⧁āĻĒ āύāĻžā§œāϛ⧇āύ
  • āĻĻā§āĻŦāĻŋāĻ¤ā§€ā§ŸāϜāύ āĻāĻ•āχ āϏāĻŽā§Ÿā§‡ āϏāĻŦāϜāĻŋ āĻ•āĻžāϟāϛ⧇āύ 👉 āĻāĻ–āĻžāύ⧇ āĻĻ⧁āϟāĻŋ āĻ•āĻžāϜ āĻāĻ•āχ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋ āϚāϞāϛ⧇āĨ¤

🧠 āĻŽā§‚āϞ āϧāĻžāϰāĻŖāĻž

  • āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ = “āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻžāϜ āĻāĻ•āχ āϏāĻŽā§Ÿā§‡ āϏāĻŽā§āĻĒāĻ¨ā§āύ āĻ•āϰāĻžâ€
  • āĻĢā§‹āĻ•āĻžāϏ: Execution / Speed
  • āĻāĻ•āĻžāϧāĻŋāĻ• āϕ⧋āϰ (multi-core CPU) āφāĻŦāĻļā§āϝāĻ•
  • āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ āĻĨāĻžāĻ•āϞ⧇āχ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ āύāĻžāĻ“ āĻĨāĻžāĻ•āϤ⧇ āĻĒāĻžāϰ⧇, āϤāĻŦ⧇ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽā§‡āϰ āĻŽāĻ§ā§āϝ⧇ āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ āĻ…āĻŦāĻļā§āϝāχ āĻĨāĻžāϕ⧇āĨ¤

âš–ī¸ ā§Š āĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ āĻŦāύāĻžāĻŽ āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (āĻŽā§‚āϞ āĻĒāĻžāĻ°ā§āĻĨāĻ•ā§āϝ)

āĻŦ⧈āĻļāĻŋāĻˇā§āĻŸā§āϝāĻ•āύāĻ•āĻžāϰ⧇āĻ¨ā§āϏāĻŋ (Concurrency)āĻĒā§āϝāĻžāϰāĻžāϞāĻžāϞāĻŋāϏāĻŽ (Parallelism)
āϏāĻ‚āĻœā§āĻžāĻžāĻāĻ•āχ āϏāĻŽā§Ÿā§‡ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻžāϜ āĻĒāϰāĻŋāϚāĻžāϞāύāĻž āĻ•āϰāĻž (Managing)āĻāĻ•āχ āĻŽā§āĻšā§‚āĻ°ā§āϤ⧇ āĻāĻ•āĻžāϧāĻŋāĻ• āĻ•āĻžāϜ āϏāĻŽā§āĻĒāĻžāĻĻāύ āĻ•āϰāĻž (Executing)
āϞāĻ•ā§āĻˇā§āϝāĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽāϕ⧇ āĻāĻŽāύāĻ­āĻžāĻŦ⧇ āϏāĻžāϜāĻžāύ⧋ āϝāĻžāϤ⧇ āĻ…āύ⧇āĻ• āĻ•āĻžāϜ āĻāĻ•āϏāĻžāĻĨ⧇ āϏāĻžāĻŽāϞāĻžāύ⧋ āϝāĻžā§ŸāĻāĻ•āĻžāϧāĻŋāĻ• āϕ⧋āϰ āĻŦā§āϝāĻŦāĻšāĻžāϰ āĻ•āϰ⧇ āĻĒā§āϰ⧋āĻ—ā§āϰāĻžāĻŽā§‡āϰ āĻ—āϤāĻŋ āĻŦāĻžā§œāĻžāύ⧋
āĻĢā§‹āĻ•āĻžāϏDesign / StructureExecution / 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-āϤ⧇ āĻŽāĻžāĻ§ā§āϝāĻŽGoroutineRuntime Scheduler
āϝ⧋āĻ—āĻžāϝ⧋āĻ—ChannelsShared memory āĻŦāĻž channels
āĻĒā§āĻ°ā§Ÿā§‹āϜāĻ¨ā§€ā§Ÿ CPU āϕ⧋āϰ⧧āϟāĻŋ āĻšāϞ⧇āχ āϚāϞ⧇⧍ āĻŦāĻž āϤāĻžāϰ āĻŦ⧇āĻļāĻŋ āϕ⧋āϰ āĻĒā§āĻ°ā§Ÿā§‹āϜāύ
āĻĢā§‹āĻ•āĻžāϏDesign / StructureExecution / 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 controlRuntime Scheduler + GOMAXPROCS
āĻŽā§‚āϞ āωāĻ•ā§āϤāĻŋ“Concurrency ≠ Parallelism”