κΉ¨μ•Œ κ°œλ… πŸ“‘/Kotlin

[Kotlin] Couroutine - μŠ€λ ˆλ“œ(Thread)와 μŠ€λ ˆλ“œ ν’€(Thread Pool)

interfacer_han 2024. 2. 15. 12:19

#1 μŠ€λ ˆλ“œ (Thread)

#1-1 κ°œλ…

λ‹€λ₯Έ μš©μ–΄λ“€κ³Όμ˜ 관계λ₯Ό 톡해 'μŠ€λ ˆλ“œ'λΌλŠ” κ°œλ…μ˜ μœ€κ³½μ„ μž‘λŠ”λ‹€.


#1-2 μŠ€λ ˆλ“œμ˜ μ‹€μ‹œκ°„μ„±

이 μ˜ˆμ‹œ λ„μ‹λ„μ—μ„œ μ‹œμ  Aμ—μ„œμ™€ μ‹œμ  Bμ—μ„œμ˜ μŠ€λ ˆλ“œλŠ” 각각 1κ°œμ™€ 2κ°œμ™€ κ·Έ κ°―μˆ˜κ°€ μ„œλ‘œ λ‹€λ₯΄λ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” ν”„λ‘œκ·Έλž¨μ˜ μ‹€ν–‰ 쀑인 μΈμŠ€ν„΄μŠ€μ΄κΈ° λ•Œλ¬Έμ—, μŠ€λ ˆλ“œλŠ” μ‹€μ‹œκ°„μ„±μ„ μ§€λ‹Œλ‹€. 예λ₯Ό λ“€μ–΄, μ‚¬λžŒμ„ ν”„λ‘œμ„ΈμŠ€λΌκ³  λΉ„μœ ν•΄λ³΄κ² λ‹€. 톡화λ₯Ό ν•˜λ©΄μ„œ μš”λ¦¬λ₯Ό ν•˜λŠ” μ‚¬λžŒμ€ 2개의 병렬 μŠ€λ ˆλ“œλ₯Ό μ§€λ‹ˆκ³  μžˆλ‹€κ³  λ³Ό 수 μžˆλ‹€. κ·ΈλŸ¬λ‹€κ°€ 톡화가 μ’…λ£Œλ˜μ–΄ μš”λ¦¬μ—λ§Œ μ§‘μ€‘ν•˜λ©΄, κ·Έ μ‚¬λžŒμ€ μš”λ¦¬λΌλŠ” 단일 μŠ€λ ˆλ“œλ§Œ μžˆλŠ” ν”„λ‘œμ„ΈμŠ€κ°€ λœλ‹€. 이와 같이 ν”„λ‘œμ„ΈμŠ€κ°€ μ–΄λŠ μ‹œμ  μ–΄λŠ μˆœκ°„μ— μžˆλŠλƒμ— λ”°λΌμ„œ μŠ€λ ˆλ“œμ˜ κ°―μˆ˜λŠ” μ–Όλ§ˆλ“ μ§€ λ³€ν•  수 μžˆλ‹€.

 

#2 μŠ€λ ˆλ“œ ν’€ (Thread Pool)

#2-1 κ°œλ…

ν”„λ‘œκ·Έλž¨μ΄ λͺ…λ Ήμ–΄μ˜ 집합이듯, μŠ€λ ˆλ“œμ˜ 집합은 μŠ€λ ˆλ“œ 풀이닀. ν•˜μ§€λ§Œ "λͺ…λ Ήμ–΄λ₯Ό λͺ¨μ•„ ν”„λ‘œκ·Έλž¨μ„ λ§Œλ“ λ‹€"λŠ” 말은 κ·ΈλŸ΄λ“―ν•΄λ„, "μŠ€λ ˆλ“œλ₯Ό λͺ¨μ•„ μŠ€λ ˆλ“œ 풀을 λ§Œλ“ λ‹€"λŠ” 말은 μ–΄μƒ‰ν•˜λ‹€. μ™œλƒν•˜λ©΄, μŠ€λ ˆλ“œλŠ” μŠ€λ ˆλ“œ ν’€λ‘œλΆ€ν„° λ§Œλ“€μ–΄μ§€κΈ° λ•Œλ¬Έμ΄λ‹€. 즉, 선후관계가 λ°˜λŒ€λ‹€. ν”„λ‘œμ„ΈμŠ€λŠ” μŠ€λ ˆλ“œ ν’€μ—κ²Œ μŠ€λ ˆλ“œλ₯Ό 'μš”μ²­'ν•œλ‹€. μŠ€λ ˆλ“œ 풀은 μ–΄λ–€ ν•œ μŠ€λ ˆλ“œλ₯Ό 'ν• λ‹Ή'ν•œλ‹€. κ·Έ ν• λ‹Ήλœ μŠ€λ ˆλ“œμ˜ μ“°μž„μ΄ λ‹€ν•˜λ©΄, λ‹€μ‹œ μŠ€λ ˆλ“œ ν’€λ‘œ 'λ°˜ν™˜'λœλ‹€. μŠ€λ ˆλ“œ ν’€μ˜ 이름에 ν’€(Pool)이 λ“€μ–΄κ°€ μžˆλŠ” μ΄μœ κΈ°λ„ ν•˜λ‹€. Pool의 사전적 μ˜λ―ΈλŠ” 웅덩이, λͺ¨μœΌλ‹€, κ³ μ—¬ μžˆλŠ” κ³³ λ”°μœ„λ‹€. μŠ€λ ˆλ“œ ν’€λ‘œλΆ€ν„° μŠ€λ ˆλ“œλ₯Ό ν• λ‹Ήλ°›λŠ” 것은 μ›…λ©μ΄μ—μ„œ λ­”κ°€λ₯Ό κΊΌλ‚΄μ˜€λŠ” κ²ƒμœΌλ‘œ λΉ„μœ ν•  수 μžˆλ‹€.

 

Coroutineμ—μ„œ μŠ€λ ˆλ“œλ₯Ό ν• λ‹Ήλ°›λŠ” μˆœκ°„μ€ Coroutine builderλ₯Ό μ‚¬μš©ν•˜λŠ” μˆœκ°„μ΄λ‹€ (CoroutineScopeλ₯Ό μ‚¬μš©ν•˜λŠ” μˆœκ°„μ΄ μ•„λ‹ˆλ‹€. CoroutineScopeλŠ” Coroutine builder의 ν™˜κ²½ 섀정에 λΆˆκ³Όν•˜λ‹€). 그리고 κ·Έ Builderκ°€ μ’…λ£Œλ˜λ©΄, μžλ™μœΌλ‘œ λ°˜ν™˜λœλ‹€.

 

#2-2 단일 μŠ€λ ˆλ“œλ§Œμ΄ μ‘΄μž¬ν•˜λŠ” μŠ€λ ˆλ“œ ν’€ - Dispatchers.Main

μ•ˆλ“œλ‘œμ΄λ“œμ˜ Dispatchers.Main은 마치, 단일 ν•¨μˆ˜κ°€ λ³Έμ²΄μ§€λ§Œ ν˜•νƒœλŠ” μΈν„°νŽ˜μ΄μŠ€μΈ SAMκ³Ό λΉ„μŠ·ν•˜λ‹€. Dispatchers.Main은 ν˜•νƒœλ§Œ μŠ€λ ˆλ“œ 풀이고, 사싀은 단일 μŠ€λ ˆλ“œλ‹€. 1개의 μŠ€λ ˆλ“œλ§Œμ΄ ν• λ‹Ή 및 λ°˜ν™˜λ˜λ―€λ‘œ, Dispatchers.Main μŠ€λ ˆλ“œ 풀에 μ—¬λŸ¬κ°€μ§€ 일을 μ‹œν‚€λ©΄ μ ˆλŒ€λ‘œ λ³‘λ ¬μ μœΌλ‘œ μ‹€ν–‰λ˜μ§€ μ•Šκ³ , μš”μ²­ν•œ μˆœμ„œλŒ€λ‘œ 직렬(순차)적으둜 μ‹€ν–‰λœλ‹€.

 

λ‹€ν–‰νžˆ, μ•ˆλ“œλ‘œμ΄λ“œμ˜ Dispatchers.Main은 Block λ˜λŠ” Suspendκ°€ μ›μ²œμ μœΌλ‘œ λΆˆκ°€λŠ₯ν•˜λ‹€. κ·Έλ ‡κ²Œ μ„€κ³„λœ μ΄μœ λŠ” μ•ˆλ“œλ‘œμ΄λ“œμ—μ„œλŠ” 메인 μŠ€λ ˆλ“œ(Main Thread)μ—μ„œ λ„€νŠΈμ›Œν¬ μš”μ²­μ΄λ‚˜ 파일 μž…μΆœλ ₯ λ“±κ³Ό 같은 UI 외적인 μž‘μ—…μ„ μˆ˜ν–‰ν•˜λ©΄ μ•±μ˜ 응닡성이 λ–¨μ–΄μ§€κΈ° λ•Œλ¬Έμ΄λ‹€. λ”°λΌμ„œ Dispatchers.Main에 μ—¬λŸ¬κ°€μ§€ 일을 μ‹œμΌœμ„œ 앱이 λ²„λ²…μ΄λŠ”(?) κ±Έ 보고 μ‹Άλ‹€λ©΄, runBlockingμ΄λ‚˜ Job.join()μœΌλ‘œλŠ” λΆˆκ°€λŠ₯ν•˜κ³  κ·Έλƒ₯ Main μŠ€λ ˆλ“œμ— 일을 λ¬΄μ‹ν•˜κ²Œ 많이 μ‹œν‚€λ©΄ λœλ‹€. κ·Έ μ˜ˆλŠ” 이 κ²Œμ‹œκΈ€μ˜ #2-3에 μžˆλ‹€.

 

#3 μš”μ•½

μŠ€λ ˆλ“œλŠ” 흐름이고, μŠ€λ ˆλ“œ ν’€(Pool)λ‘œλΆ€ν„° ν• λ‹Ήλœλ‹€.