๐Ÿค” Thread vs Coroutine ์ „๊ฒฉ ๋น„๊ต

haero_kimยท2021๋…„ 8์›” 19์ผ
68

CS ๋ฟŒ์…”๋จน๊ธฐ

๋ชฉ๋ก ๋ณด๊ธฐ
1/17
post-thumbnail

ํ•„์ž๋Š” ๋งค๋ฒˆ ์ฝ”ํ‹€๋ฆฐ์„ ์‚ฌ์šฉํ•˜๋‹ค๋ณด๋‹ˆ, ์–ธ์–ด์ฐจ์›์—์„œ 'Coroutine'์ด๋ผ๋Š” ๋…€์„์„ ๋Œ€๋นต ๋ฐ€์–ด์ฃผ๋Š” ๋Š๋‚Œ์„ ๋ฐ›์•˜๊ณ  ์ด๋ฅผ ์ ‘๋ชฉํ•˜์—ฌ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด๋ณด๊ธฐ๋„ ํ–ˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์–ผํ• ๋ณด๊ธฐ์—” Thread ์™€ ๋น„์Šทํ•œ(?) ๋™์ž‘์„ ํ•˜๋Š” ๊ฒƒ ๊ฐ™์•„ ๋ช…ํ™•ํ•œ ์ฐจ์ด์ ์„ ์•Œ๊ธฐ ์–ด๋ ค์› ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„  ์“ฐ๋ ˆ๋“œ์™€ ์ฝ”๋ฃจํ‹ด์˜ ์ฐจ์ด์ ์— ๋Œ€ํ•˜์—ฌ ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

๐Ÿคš๐Ÿป ๊ฐ€๋ณ๊ฒŒ ๋‹ค์‹œ ์งš์–ด๋ณด๊ธฐ

๋™๊ธฐ : ์–ด๋–ค ์š”์ฒญ์„ ๋ณด๋‚ธ ๋’ค, ๊ทธ ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๊ฐ’์„ ์–ป๊ธฐ๊นŒ์ง€ ์ž‘์—…์„ ๋ฉˆ์ถ”๋Š” ๊ฒƒ
๋น„๋™๊ธฐ : ์–ด๋–ค ์š”์ฒญ์„ ๋ณด๋‚ธ ๋’ค, ๊ทธ ์š”์ฒญ์˜ ๊ฒฐ๊ณผ๊ฐ’์ด ์˜ค๊ธฐ๊นŒ์ง€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ๋˜ ๋‹ค๋ฅธ ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ

์“ฐ๋ ˆ๋“œ์™€ ์ฝ”๋ฃจํ‹ด์˜ ์ฐจ์ด์ ์— ๊ด€ํ•ด ์•Œ์•„๋ณด๊ธฐ ์ „์—, ๋ช‡ ๊ฐ€์ง€ ์„ ์ˆ˜์ง€์‹์„ ์‚ดํŽด๋ณด์ž!

Process with Thread

Process : ๋ณด์กฐ๊ธฐ์–ต์žฅ์น˜์˜ 'ํ”„๋กœ๊ทธ๋žจ'์ด ๋ฉ”๋ชจ๋ฆฌ ์ƒ์œผ๋กœ ์ ์žฌ๋˜์–ด ์‹คํ–‰๋˜๋ฉด 'ํ”„๋กœ์„ธ์Šค'๊ฐ€ ๋œ๋‹ค.
Thread : ๊ฐ™์€ Process ๋‚ด์—์„œ ์‹คํ–‰๋˜๋Š” ์—ฌ๋Ÿฌ ์ž‘์—… (ํ๋ฆ„)์˜ ๋‹จ์œ„

Process ๋Š” ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ 'ํž™'์„ ํ• ๋‹น๋ฐ›๋Š”๋‹ค.

Thread ๋Š” Process ํ•˜์œ„์— ์ข…์†๋˜๋Š” ๋ณด๋‹ค ์ž‘์€ ๋‹จ์œ„์ด๊ณ , ๊ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๋…๋ฆฝ๋œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์ธ ์Šคํƒ(Stack) ์„ ๊ฐ–๋Š”๋‹ค. Thread ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๋ฉด, ํ•˜๋‚˜์˜ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ƒ๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ ์“ฐ๋ ˆ๋“œ๋Š” ๋‹ค๋ฅธ ์“ฐ๋ ˆ๋“œ์—๊ฒŒ ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์—†๋‹ค. ํ•˜์ง€๋งŒ ํ”„๋กœ์„ธ์Šค์˜ ํž™์€ ์†ํ•œ ๋ชจ๋“  Thread ๊ฐ€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋™์‹œ์„ฑ vs ๋ณ‘๋ ฌ์„ฑ

๋™์‹œ์„ฑ (Concurrency)

๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ๋ง ๊ทธ๋Œ€๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ˆˆ์œผ๋กœ ๋ณด๊ธฐ์— ๋™์‹œ์— ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด์ง€, ์‚ฌ์‹ค ์‹œ๋ถ„ํ• (Interleaving) ๊ธฐ๋ฒ•์„ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์กฐ๊ธˆ์”ฉ ๋‚˜๋ˆ„์–ด์„œ ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์œ„ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๋ฉด, Task 1 ๊ณผ Task 2 ๋ฅผ ์ž˜๊ฐœ ์ชผ๊ฐœ์–ด ๋ฒˆ๊ฐˆ์•„๊ฐ€๋ฉฐ ์ˆ˜ํ–‰ํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„  ๋‘ ์ž‘์—…์ด ๋™์‹œ์— ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€๊ฒŒ ๋œ๋‹ค. ๋”ฐ๋ผ์„œ 10๋ถ„ + 10๋ถ„, ์ด 20๋ถ„์ด ์†Œ์š”๋œ๋‹ค. (Context Switching ๊ณ ๋ ค X)

๋ณ‘๋ ฌ์„ฑ (Parallelism)

๋ณ‘๋ ฌ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์€ ์‹œ๋ถ„ํ•  ๊ธฐ๋ฒ•์—†์ด ์ฐ์œผ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ํ•œ ๋ฒˆ์— ๋™์‹œ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์ž์›(CPU ์ฝ”์–ด)์˜ ์ž…์žฅ์—์„  ์ž๊ธฐ๋Š” ์ž๊ธฐ ํ•  ์ผ 1๊ฐœ๋ฅผ ํ•˜๋Š” ๊ฒƒ ๋ฟ์ด๋‹ค. ์ฆ‰, ๋ณ‘๋ ฌ์„ฑ์€ '์ž์›(CPU ์ฝ”์–ด)์ด ์—ฌ๋Ÿฌ ๊ฐœ' ์ผ ๋•Œ ๊ฐ€๋Šฅํ•˜๋‹ค.

์œ„ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. Task 1 ๊ณผ Task 2 ๊ฐ€ ๋ณ‘๋ ฌ์ ์œผ๋กœ ๋™์‹œ์— ์ˆ˜ํ–‰๋œ๋‹ค. ์ด๋Š” '๋ฉ€ํ‹ฐ์ฝ”์–ด' ์‹œ์Šคํ…œ์—์„œ ๊ฐ€๋Šฅํ•œ ์ด์•ผ๊ธฐ์ด๋‹ค. ์ฝ”์–ด ๊ฐ๊ฐ์ด Task 1, Task 2 ๋ฅผ ๋งก์•„ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด, ์™„์ „ํžˆ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๋”ฐ๋ผ์„œ, ๊ฐ๊ฐ ํƒœ์Šคํฌ๊ฐ€ 10๋ถ„์”ฉ์ด๋ผ๋ฉด, ์ตœ์ข…์ ์œผ๋กœ 10๋ถ„์ด ์†Œ์š”๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด ๊ฒฝ์šฐ Context Switching ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

๋™์‹œ์„ฑ ๋ณ‘๋ ฌ์„ฑ ์ด์•ผ๊ธฐ๋Š” ์™œ..?

Thread ์™€ Coroutine ์€ ๋ชจ๋‘ '๋™์‹œ์„ฑ ํ”„๋กœ๊ทธ๋ž˜๋ฐ'์„ ์œ„ํ•œ ๊ธฐ์ˆ ์ด๋‹ค. ์ด์ œ๋ถ€ํ„ฐ, '๋™์‹œ์„ฑ'์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๋‘ ๊ธฐ์ˆ ์ธ Thread ์™€ Coroutine ์˜ ๊ฐœ๋…๊ณผ ์ฐจ์ด์ ์— ๋Œ€ํ•˜์—ฌ ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž.


Thread vs Coroutine

๊ฐœ์š”

  • ์“ฐ๋ ˆ๋“œ๋Š” ๊ฐ ํƒœ์Šคํฌ์— ํ•ด๋‹นํ•˜๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๋Ÿฌ ์ž‘์—…์„ ๋™์‹œ์— ์ˆ˜ํ–‰ํ•ด์•ผํ•  ๋•Œ OS ๋Š” ์–ด๋–ค ์“ฐ๋ ˆ๋“œ ์ž‘์—…์„ ๋จผ์ € ์ˆ˜ํ–‰ํ• ์ง€, ์–ด๋–ค ์“ฐ๋ ˆ๋“œ๋ฅผ ๋” ๋งŽ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํšจ์œจ์ ์ธ์ง€์— ๋Œ€ํ•œ ์Šค์ผ€์ฅด๋ง (์„ ์  ์Šค์ผ€์ฅด๋ง, Preempting Scheduling) ์„ ํ•ด์•ผ ํ•œ๋‹ค.

  • Coroutuine ์€ Lightweight Thread ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค. (์ฝ”ํ‹€๋ฆฐ ๊ธฐ์ค€, ๊ณต์‹ ๋ฌธ์„œ์—๋„ ์ด๋ ‡๊ฒŒ ์„ค๋ช…๋˜์–ด ์žˆ๋‹ค) ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž‘์—… ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋ถ„๋ฐฐํ•ด์„œ ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜์ง€๋งŒ, ์ž‘์—… ํ•˜๋‚˜ํ•˜๋‚˜์— Thread ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ 'Object' ๋ฅผ ํ• ๋‹นํ•ด์ฃผ๊ณ , ์ด Object ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์Šค์œ„์นญํ•จ์œผ๋กœ์จ Context Switching ๋น„์šฉ์„ ๋Œ€ํญ ์ค„์ธ ๊ฒƒ์ด๋‹ค.

Thread

  • ์ž‘์—… ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋‹จ์œ„ : Thread
    • ๊ฐ Thread ๊ฐ€ ๋…๋ฆฝ์ ์ธ Stack ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ ๊ฐ€์ง
  • ๋™์‹œ์„ฑ ๋ณด์žฅ ์ˆ˜๋‹จ : Context Switching
    • ์šด์˜์ฒด์ œ ์ปค๋„์— ์˜ํ•œ Context Switching ์„ ํ†ตํ•ด ๋™์‹œ์„ฑ ๋ณด์žฅ
    • ๋ธ”๋กœํ‚น (Blocking) : Thread A ๊ฐ€ Thread B ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋ฉด, Thread A ์€ ๋ธ”๋กœํ‚น๋˜์–ด Thread B ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ฌ ๋•Œ ๊นŒ์ง€ ํ•ด๋‹น ์ž์›์„ ๋ชป ์”€

์•„๋ž˜ ์˜ˆ์‹œ ์‚ฌ์ง„์„ ์‚ดํŽด๋ณด์ž.

Thread A ์—์„œ Task 1 ์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ Task 2 ์˜ ๊ฒฐ๊ณผ๊ฐ€ ํ•„์š”ํ•  ๋•Œ, ๋น„๋™๊ธฐ์ ์œผ๋กœ Thread B ๋ฅผ ํ˜ธ์ถœ์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ Thread A ๋Š” ๋ธ”๋กœํ‚น๋˜๊ณ , Thread B ๋กœ Context Switching ์ด ์ผ์–ด๋‚˜ Task 2 ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค. Task 2 ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด, ๋‹ค์‹œ Thread A ๋กœ Context Switching ์ด ์ผ์–ด๋‚˜ ๊ฒฐ๊ณผ๊ฐ’์„ Task 1 ์— ๋ฐ˜ํ™˜ํ•œ๋‹ค.

๋™์‹œ์— ๊ฐ™์ด ์ˆ˜ํ–‰ํ•  Task 3, Task 4 ๋Š” ๊ฐ๊ฐ Thread C ์™€ D ์— ํ• ๋‹น๋˜๊ณ , ์ด์ฒด์ ์œผ๋กœ ๋ดค์„ ๋•Œ ์ปค๋„ ์ž…์žฅ์—์„œ Preempting Scheduling ์„ ํ†ตํ•˜์—ฌ ๊ฐ ํƒœ์Šคํฌ๋ฅผ ์–ผ๋งŒํผ ์ˆ˜ํ–‰ํ• ์ง€, ํ˜น์€ ๋ฌด์—‡์„ ๋จผ์ € ์ˆ˜ํ–‰ํ• ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜์—ฌ ์•Œ๋งž๊ฒŒ ๋™์‹œ์„ฑ์„ ๋ณด์žฅํ•˜๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

Coroutine

  • ์ž‘์—… ํ•˜๋‚˜ํ•˜๋‚˜์˜ ๋‹จ์œ„ : Coroutine Object
    • ์—ฌ๋Ÿฌ ์ž‘์—… ๊ฐ๊ฐ์— Object ๋ฅผ ํ• ๋‹นํ•จ
    • Coroutine Object ๋„ ์—„์—ฐํ•œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— JVM Heap ์— ์ ์žฌ ๋จ (์ฝ”ํ‹€๋ฆฐ ๊ธฐ์ค€)
  • ๋™์‹œ์„ฑ ๋ณด์žฅ ์ˆ˜๋‹จ : Programmer Switching (No-Context Switching)
    • ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด Switching ์‹œ์ ์„ ๋งˆ์Œ๋Œ€๋กœ ์ •ํ•จ (OS ๊ด€์—ฌ X)
    • Suspend (Non-Blocking) : Object 1 ์ด Object 2 ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค๊ธฐ๊นŒ์ง€ ๊ธฐ๋‹ค๋ ค์•ผ ํ•œ๋‹ค๋ฉด, Object 1 ์€ Suspend ๋˜์ง€๋งŒ, Object 1 ์„ ์ˆ˜ํ–‰ํ•˜๋˜ Thread ๋Š” ๊ทธ๋Œ€๋กœ ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— Object 2 ๋„ Object 1 ๊ณผ ๋™์ผํ•œ Thread ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Œ

์ดํ•ด๋ฅผ ์œ„ํ•ด ์•„๋ž˜ ์˜ˆ์‹œ ์‚ฌ์ง„์„ ์‚ดํŽด๋ณด์ž.

์ž‘์—… ๋‹จ์œ„๋Š” Coroutine Object ์ด๋ฏ€๋กœ, Task 1 ์„ ์ˆ˜ํ–‰ํ•˜๋‹ค๊ฐ€ ๋น„๋™๊ธฐ ์ž‘์—… Task 2 ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„, Context Switching ์—†์ด ๊ฐ™์€ Thread ์—์„œ Task 2 ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , ๋งจ ์˜ค๋ฅธ์ชฝ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ ํ•˜๋‚˜์˜ Thread ์—์„œ ์—ฌ๋Ÿฌ Coroutine Object ๋“ค์„ ๊ฐ™์ด ์ˆ˜ํ–‰ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ•œ ์“ฐ๋ ˆ๋“œ์—์„œ ๋‹ค์ˆ˜์˜ Coroutine ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ณ , Context Switching ์ด ํ•„์š”์—†๋Š” ํŠน์„ฑ์— ๋”ฐ๋ผ Coroutine ์„ Light-weight Thread ๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์œ„ ๊ฒฝ์šฐ๋ฅผ ๋‹ค์‹œ ๋ณด์ž. Thread A ์™€ C ๊ฐ€ ๋™์‹œ์— ์ˆ˜ํ–‰๋˜๋Š” ๋ชจ์Šต์ด๋‹ค. ์ด๋Ÿฌ๋ฉด ๊ฒฐ๊ตญ ๋™์‹œ์„ฑ ๋ณด์žฅ์„ ์œ„ํ•ด์„œ Context Switching ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋‹ค. ๋”ฐ๋ผ์„œ, Coroutine ์˜ 'No-Context Switching' ์žฅ์ ์„ ๊ทน๊ฐ•์œผ๋กœ ๋Œ์–ด์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด, ๋‹จ์ผ Thread ์—์„œ ์—ฌ๋Ÿฌ Coroutine Object ๋ฅผ ์ปจํŠธ๋กคํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. (๋˜๋Š” ๊ถŒ์žฅํ•œ๋‹ค)

๐Ÿ’ก ์—ฌ๊ธฐ์„œ ์•Œ ์ˆ˜ ์žˆ๋Š” ์ 

Coroutine ์€ Thread ์˜ ๋Œ€์•ˆ์ด ์•„๋‹ˆ๋ผ, Thread ๋ฅผ ๋” ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋…์ด๋‹ค.

  • ์ž‘์—…์˜ ๋‹จ์œ„๋ฅผ Object ๋กœ ์ถ•์†Œํ•˜๋ฉด์„œ ํ•˜๋‚˜์˜ Thread ๊ฐ€ ๋‹ค์ˆ˜์˜ ์ฝ”๋ฃจํ‹ด์„ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ์ž‘์—… ํ•˜๋‚˜ํ•˜๋‚˜์— Thread ๋ฅผ ํ• ๋‹นํ•˜๋ฉฐ ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„, Context Switching ๋น„์šฉ ๋‚ญ๋น„๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ
  • ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋‚ด์˜ Heap ์— ๋Œ€ํ•œ Locking ๊ฑฑ์ • ๋˜ํ•œ ์‚ฌ๋ผ์ง

ํ•œ ๋งˆ๋””๋กœ, ์ฝ”๋ฃจํ‹ด์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋ชฉ์ ๊ณผ ์˜๋„๋Œ€๋กœ ํšจ์œจ์„ฑ์„ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋™์‹œ์„ฑ ๋ณด์žฅ ๊ธฐ๋ฒ•์ด๋‹ค.

๋งˆ๋ฌด๋ฆฌ

๊ณผ๊ฑฐ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ผ ํ•จ์€ DB ํŠธ๋žœ์žญ์…˜, ๋„คํŠธ์›Œํ‚น ์š”์ฒญ ๋“ฑ์„ ์ด์•ผ๊ธฐํ–ˆ๋Š”๋ฐ, ์ตœ๊ทผ์—๋Š” ์ด๋Ÿฌํ•œ ์ž‘์—…์ด ์•„๋‹ˆ๋”๋ผ๋„ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ ‘๋ชฉํ•˜๋Š” ๊ฒƒ์„ ์‰ฝ๊ฒŒ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๊ทธ๋งŒํผ ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ„ํŽธํ•ด์กŒ๋‹ค๋Š” ์ด์•ผ๊ธฐ์ธ ๊ฒƒ ๊ฐ™๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋น„๋™๊ธฐ ์ฒ˜๋ฆฌ๊ฐ€ ๊ฐ„ํŽธํ•ด์ง์— '์ฝ”๋ฃจํ‹ด'์ด ๋งŽ์€ ๊ธฐ์—ฌ๋ฅผ ํ•œ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ํ”„๋กœ์„ธ์Šค์˜ ์ž‘์€ ์ž‘์—… ๋‹จ์œ„์ธ Thread ๋ฅผ ๋” ์ž˜๊ฒŒ ์ชผ๊ฐœ์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

ํ•ต์‹ฌ์€ ์ฝ”๋ฃจํ‹ด์ด ์“ฐ๋ ˆ๋“œ์˜ ๋Œ€์•ˆ์œผ๋กœ ๋“ฑ์žฅํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๊ณ , ์œ„์™€ ๊ฐ™์€ ์ฐจ์ด์ ์ด ์žˆ๋Š” ๋˜๋‹ค๋ฅธ ๋™์‹œ์„ฑ ๋ณด์žฅ ๋ฐฉ๋ฒ•์œผ๋กœ ์•Œ์•„๋‘๋ฉด ๋œ๋‹ค๋Š” ์ ์ด๋‹ค. Thread ๊ธฐ๋ฒ•์— ๋น„ํ•ด ๋‹ค๋ฐฉ๋ฉด์—์„œ ๋น„์šฉ์ด ์ ˆ๊ฐ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์ ๊ทน์ ์œผ๋กœ ํ™œ์šฉํ•ด๋ณด์ž.

์ฐธ๊ณ ์ž๋ฃŒ

https://stackoverflow.com/questions/1934715/difference-between-a-coroutine-and-a-thread

profile
์–ด๋ ค์šธ์ˆ˜๋ก ๊ธฐ๋ณธ์— ๋ฏธ์น˜๊ณ  ์—ด๊ด‘ํ•˜๋ผ

9๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2021๋…„ 8์›” 26์ผ

์ฐฐ์ง€๊ตฐ์š”... ์ด๋ฒˆ์—๋„ ์ž˜ ๋จน๊ณ  ๊ฐ‘๋‹ˆ๋‹ค.. ์•™..

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2021๋…„ 9์›” 10์ผ

๋Œ€ํ‘œ ์ด๋ฏธ์ง€ ๋ณด๊ณ  ๋‚˜๋„ ๋ชจ๋ฅด๊ฒŒ ์ด๋Œ๋ ค ์•Œ์ง€๋„ ๋ชปํ–ˆ๋˜ ์ง€์‹ ํ•˜๋‚˜ ์–ป์–ด๊ฐ‘๋‹ˆ๋‹ค..์ด์ด์ด...
ํ˜น์‹œ ๋Œ€ํ‘œ ์ด๋ฏธ์ง€๋Š” ์–ด๋–ป๊ฒŒ ์ œ์ž‘ํ•˜์‹œ๋‚˜์š”?!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2022๋…„ 8์›” 3์ผ

์•ˆ๋…•ํ•˜์„ธ์š”! ์ž˜ ๋ณด๊ณ  ๊ฐ‘๋‹ˆ๋‹คใ…Žใ…Ž
๋‹ค๋ฆ„์ด ์•„๋‹ˆ๋ผ โ€œ๋™์‹œ์„ฑโ€์—์„œ ์‚ฌ์‹ค์ƒ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์ด 20ms๋„ ๋™์ผํ•˜๋‹ค๋ฉด ์ˆœ์ฐจ์  ๋ฐฉ์‹์— ๋น„ํ•ด ์‹œ๊ฐ„์ ์œผ๋กœ ์ด๋“์ด ๋˜๋Š” ๊ฒƒ์€ ์—†๋Š” ๊ฑธ๊นŒ์š”??

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2022๋…„ 8์›” 10์ผ

์ž˜์ฝ๊ณ  ๊ฐ‘๋‹ˆ๋‹น ํ—ค๋กœ๋‹˜

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2022๋…„ 8์›” 25์ผ

๊ธ€ ์ž˜๋ดค์Šต๋‹ˆ๋‹ค.!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ