Skip to content

Latest commit

ย 

History

History
57 lines (43 loc) ยท 3.67 KB

File metadata and controls

57 lines (43 loc) ยท 3.67 KB

Kotlin Coroutine Basic

Coroutine์ด๋ž€?

๋จผ์ € Coroutine์˜ ๋‹จ์–ด์˜ ๋œป์„ ์•Œ์•„๋ณด๋ฉด coroutine์€ co ์™€ routine์˜ ํ•ฉ์„ฑ์–ด์ด๋‹ค.
co ๋Š” cooperation, "ํ˜‘๋ ฅํ•˜๋‹ค" ๋ผ๋Š” ๋œป์ด๊ณ , routine๋Š” ํ•จ์ˆ˜ ๋˜๋Š” ํ•˜๋‚˜์˜ ํ…Œ์Šคํฌ๋ฅผ ์˜๋ฏธํ•œ๋‹ค.
๊ฐ„๋‹จํ•˜๊ฒŒ ํ•ด์„ํ•˜์ž๋ฉด ํ˜‘๋ ฅํ•˜๋Š” ํ•จ์ˆ˜๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ๋‹ค.

Coroutine์˜ ํŠน์ง•

  • ํ˜‘๋ ฅํ˜• ๋ฉ€ํ‹ฐํ…Œ์Šคํ‚น
  • ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ง€์›

ํ˜‘๋ ฅํ˜• ๋ฉ€ํ‹ฐํ…Œ์Šคํ‚น

Sub Routine๊ณผ Coroutine์˜ ์ฐจ์ด

์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋ฅผ Sub routine์ด๋ผ๊ณ ๋„ํ•˜๋ฉฐ Sub routine์€ return์„ ๋งŒ๋‚˜๋ฉด ํƒˆ์ถœํ•˜์—ฌ Main Routine์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋œ๋‹ค.
์ฆ‰ ์ผ๋ฐ˜์ ์ธ Sub routine์€ return๋ฌธ์„ ๋งŒ๋‚˜๊ฑฐ๋‚˜ ๋‹ซ๋Š”๊ด„ํ˜ธ}๋ฅผ ๋งŒ๋‚˜๊ธฐ์ „๊นŒ์ง€๋Š” ํƒˆ์ถœํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ง„์ž…์ ์ด 1๊ฐœ, ํƒˆ์ถœ์ ๋„ 1๊ฐœ์ด๋‹ค.
๋ฐ˜๋ฉด, Coroutine์€ ์ง„์ž…์ ๊ณผ ํƒˆ์ถœ์ ์ด ์—ฌ๋Ÿฌ๊ฐœ์ด๋‹ค. Coroutine block์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ์•ˆ์—์„œ suspend ํ‚ค์›Œ๋“œ๋ฅผ ๊ฐ€์ง„ Aํ•จ์ˆ˜๋ฅผ ๋งŒ๋‚˜๋ฉด ๋” ์ด์ƒ ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋ฉˆ์ถ˜๋‹ค(suspend) ๊ทธ๋ฆฌ๊ณ  Coroutine block์„ ํƒˆ์ถœํ•œ๋‹ค.
ํƒˆ์ถœํ•œ๋’ค ๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์ด ์‹คํ–‰๋˜๋ฉฐ Aํ•จ์ˆ˜๋Š” ์–ด๋””์„ ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค.
๋‹ค๋ฅธ ์ฝ”๋“œ๋“ค์ด ์‹คํ–‰๋˜๋‹ค๊ฐ€๋„ Aํ•จ์ˆ˜๊ฐ€ ๋๋‚˜๊ฒŒ๋˜๋ฉด ๋‹ค์‹œ Coroutine block์œผ๋กœ ์ง„์ž…ํ•˜์—ฌ Aํ•จ์ˆ˜ ๋‹ค์Œ๋ถ€๋ถ„์ด ์‹คํ–‰๋œ๋‹ค.
์ด๋ฅผ ํ˜‘๋ ฅํ˜• ๋ฉ€ํ‹ฐํ…Œ์Šคํ‚น์ด๋ผ ํ•œ๋‹ค.

๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ

ํ•จ์ˆ˜๋ฅผ ์ค‘๊ฐ„์— ๋น ์ ธ๋‚˜์™”๋‹ค๊ฐ€, ๋‹ค๋ฅธ ํ•จ์ˆ˜์— ์ง„์ž…ํ•˜๊ณ , ๋‹ค์‹œ ์›์ ์œผ๋กœ ๋Œ์•„์™€ ๋ฉˆ์ถ”์—ˆ๋˜ ๋ถ€๋ถ„๋ถ€ํ„ฐ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ์ด ํŠน์„ฑ์€ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•œ๋‹ค.
Coroutine์„ ์ƒ์„ฑํ•˜์—ฌ์„œ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ํ•˜๋Š” ํŠน์ง•๋•Œ๋ฌธ์— ๊ฐ€๋ณ๊ณ  ํšจ์œจ์ ์ธ ์„ฑ๋Šฅ์œผ๋กœ ๋™์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
๋งŒ์•ฝ ์Šค๋ ˆ๋“œ๋กœ Coroutine์ด ์•„๋‹Œ Thread๋‘๊ฐœ๋กœ ๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•œ๋‹ค๋ฉด CPU๊ฐ€ ๋งค๋ฒˆ Thread๋ฅผ ์ ์šฐํ–ˆ๋‹ค๊ฐ€ ๋†“์•„์ฃผ๊ธฐ๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ Context-Switching์ด ๋ฐœ์ƒํ•œ๋‹ค (๋น„์šฉ์ด ํฌ๋‹ค)

๋™์‹œ์„ฑ(Concurrency) vs ๋ณ‘๋ ฌ(Parallelism)

๋™์‹œ์„ฑ ๋ณ‘๋ ฌ
๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ ๊ฐ™์ด ๋ณด์ด๋Š” ๊ฒƒ ์‹ค์ œ๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์ด ์ฒ˜๋ฆฌ๋˜๋Š” ๊ฒƒ
image image

Context-Switching

์Šค๋ ˆ๋“œ ์‹คํ–‰ ํ˜น์€ ์ข…๋ฃŒ์‹œ ์Šค๋ ˆ๋“œ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ณ  ๋ณต๊ตฌํ•˜๋Š” ํ”„๋กœ์„ธ์Šค
= ๋‘๊ฐœ์˜ ์Šค๋ ˆ๋“œ์—์„œ ์ž‘์—… ์‹œ CPU๊ฐ€ ๋งค๋ฒˆ ์Šค๋ ˆ๋“œ๋ฅผ ์ ์œ ํ–ˆ๋‹ค๊ฐ€ ๋†“์•„์ฃผ๋Š” ๊ฒƒ์„ ๋ฐ˜๋ณตํ• ๋•Œ ๋น„์šฉ ๋ฐœ์ƒ

Thread vs Coroutine

์ฝ”๋ฃจํ‹ด์ด ํ•˜๋‚˜์˜ ์‹คํ–‰-์ข…๋ฃŒ๋˜์–ด์•ผ ํ•˜๋Š” ์ผ(Job)์ด๋ผ๋ฉด ์Šค๋ ˆ๋“œ๋Š” ๊ทธ ์ผ์ด ์‹คํ–‰๋˜๋Š” ๊ณณ์ด๋‹ค.

  • ์ฝ”๋ฃจํ‹ด๊ณผ ์Šค๋ ˆ๋“œ๋Š” ๋ชจ๋‘ ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ด๋‹ค
  • ํ•˜๋‚˜์˜ ์Šค๋ ˆ๋“œ์— ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฝ”๋ฃจํ‹ด์ด ๋™์‹œ์—(concurrency) ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋‹ค
  • ๋ ˆ๋“œ๋Š” ์—ฌ๋Ÿฌ์Šค๋ ˆ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ณ‘๋ ฌ๋กœ(Parallelism) ์‹คํ–‰๋œ๋‹ค
  • ์ฝ”๋ฃจํ‹ด์˜ ๊ฒฝ์šฐ ์Šค๋ ˆ๋“œํ’€์„ ์‚ฌ์šฉํ•˜๋Š” dispatcher๋กœ ์ฝ”๋ฃจํ‹ด๋“ค์„ ์‹คํ–‰ํ•˜๋ฉด ์Šค๋ ˆ๋“œ์ฒ˜๋Ÿผ ๋ณ‘๋ ฌํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค

Coroutine์˜ ์žฅ์ 

  • ๊ฒฝ๋Ÿ‰ : ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰์ค‘์ธ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š” ์ •์ง€๋ฅผ ์ง€์›ํ•˜๋ฏ€๋กœ ๋‹จ์ผ์Šค๋ ˆ๋“œ์—์„œ ๋งŽ์€ ์ฝ”๋ฃจํ‹ด์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๊ฐ์†Œ : ๊ตฌ์กฐํ™”๋œ ๋™์‹œ์‹คํ–‰์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒ”์œ„ ๋‚ด์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•œ๋‹ค
  • ์ฒ˜๋ฆฌ ๋„์ค‘ ์ทจ์†Œ ๊ฐ€๋Šฅ : ์‹คํ–‰์ค‘์ธ ์ฝ”๋ฃจํ‹ด์˜ ๊ณ„์ธต๊ตฌ์กฐ๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ์ทจ์†Œ๊ฐ€ ์ „๋‹ฌ๋œ๋‹ค
    • ๋‹ค๋ฅธ ์ฒ˜๋ฆฌ๋ฅผ ์ค‘๋‹จ(blocking)์‹œํ‚ค์ง€ ์•Š๊ณ  ์ค‘์ง€(suspend)ํ•˜๋Š” ํ˜•ํƒœ๋กœ ๊ฐ€๋ณ๊ฒŒ ๋™์ž‘