์์์๋ Swift concurrency๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ์ธํ๋ค. ์ด๋ฒ์๋ Swift concurrency๋ฅผ ์ฑํํ ๋ ์ฃผ์ํด์ผ ํ๋์ , ๊ทธ๋ฆฌ๊ณ Actor๋ฅผ ํตํ Synchronization์ ๋ํด ์์๋ณด์.
Adoption of Swift Concurrency
์ด๋ฒ์๋ Swift Concurrency๋ฅผ ์ฌ์ฉํ๋ฉด์ ๊ณ ๋ คํด์ผ ํ ์ฌํญ๋ค์ ๋ํด ์์๋ณด์.
Performance
์์์ Concurrency๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ์ถ๊ฐ memory๊ณผ ๊ด๋ จ๋ cost์ ๋ํด ์์๋ณด์๋ค. ์ด๋ฌํ ์ ์ ์ฌ์ ํ ์ ์ฉ๋๋ฉฐ, Concurrency๋ฅผ ๋์ ํ์ฌ ์ป์ ์ ์๋ ๋น์ฉ์ด ์ฝ๋์ ๊ด๋ฆฌ ๋น์ฉ์ ๋๋ ๊ฒฝ์ฐ์๋ง ์ด๋ฅผ ๋์ ํด์ผ ํ๋ค.
์์ ๊ฐ์ด userDefaults์์ ๋จ์ํ ๊ฐ์ ์ผ์ด์ค๋๋ฐ ์์ด์ ๊ตณ์ด asyncํ๊ฒ task๋ฅผ ๋ง๋ค์ด์ ์ฒ๋ฆฌํ ํ์๋ ์๋ค. task๋ฅผ ๋ง๋ค์ด์ ์ฒ๋ฆฌํ๋ ๋น์ฉ์ด, task๋ฅผ ๋ง๋๋ ๋น์ฉ๋ณด๋ค ํฌ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ apple์์๋ Instruments system์ ํตํด Swift concurrency๋ฅผ ์ฑํํ์ ๋ ์ป์ ์ ์๋ ์ฑ๋ฅ ์งํ๋ค์ ํ์ธํด๋ณด๋ ๊ฒ์ ์ถ์ฒํ๋ค.
Notion of Atomicity around await
await
์ ๊ฑธ์ณ lock์ ๊ฑธ์ง ์๋๋ค.
Swift๋ await
์ด์ ์ ์คํ๋์๋ thread์ ์ดํ์ ์คํ๋๋ ์ฝ๋์ thread๊ฐ ๊ฐ์ ๊ฒ์ ๋ณด์ฅํด์ฃผ์ง ์๋๋ค. ์ด๋ ์์์ await
๊ทผ๋ฐฉ์์ ์ด๋ป๊ฒ ์ฝ๋๊ฐ ๋์ํ๋์ง๋ฅผ ๊ทผ๊ฐ์ผ๋ก ํ๋ค. await
๋ ์ฝ๋์์ ์์
์ด ์๋ฐ์ ์ผ๋ก ์ทจ์๋ ์ ์๊ธฐ ๋๋ฌธ์, ์์
์ ์์์ฑ์ด ๊นจ์ก์์ ๋ช
ํํ๊ฒ ๋ํ๋ด๋ ์ง์ ์ด๋ผ ํ ์ ์๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์, ๊ทธ ๊ธ๋ฐฉ์์ lock์ ๊ฑธ๋ฉด ์๋๋ค. ๋ค์ ํด๋น thread๋ก ๋์์จ๋ค๋ ๋ณด์ฅ์ด ์๊ธฐ ๋๋ฌธ์ด๋ค.
thread์ ํนํ๋ ๋ฐ์ดํฐ๋ await์ ๊ฑธ์ณ ๋ณด์กด๋์ง ์๋๋ค.
์ด ์ญ์ ๋ง์ฐฌ๊ฐ์ง์ด๋ค. await
๋ค์ ๋์ํ๋ thread ๋ณด์ฅ์ด ๋์ง ์๊ธฐ ๋๋ฌธ์ ์ธ์ ์ฑ์ ๊ฐ์ ํ๊ณ ์์ฑํ ์ฝ๋๋ ์ฌ๊ฒํ ๊ฐ ํ์ํ๋ค.
Runtime contract๋ฅผ ๋ณด์กดํด์ผ ํ๋ค. ์ฆ, thread๊ฐ ๊ณ์ํด์ ์์ผ๋ก ์ ์งํ ์ ์๋๋ก ํด์ฃผ์ด์ผ ํ๋ค.
thread์ ๊ฐ์๋ฅผ ์ ํํ๊ณ , ๊ฐ task์์ continuation์ ํตํด ๋์์ ๋์๊ฐ๊ฒ ํ๋ ๋งํผ, ์ด ๊ด๋ฆฌ๋ ์ค์ํ๋ค. ์ฆ, Cooperativeํ thread pool์ ์ฌ์ฉ๊ฐ๋ฅํ๋๋ก ํด์ผํ๋ค๋ ๊ฒ์ด๋ค.
|โ
Safe primitives|โ ๏ธ
Caution required|๐
unsafe primitives|
|:----------------:โ|:------------------:----|:------------------:---|
|await
,
Actors,
Task groups|๋๊ธฐ ์ฝ๋์์ ์ฌ์ฉํ๋
os_unfair_lock
,
NSLock
|DispatchSemephore
,
pthread_cond
,
NSCondition
,
pthread_rw_loc
,
โฆ|
|Compiler ๊ฐ์ |Compiler ๋ณด์กฐ ์์|Compiler ๋ณด์กฐ ์์|
||์ ์๋ ค์ง critical section ์ฃผ๋ณ์์ ๋๊ธฐ ์ฝ๋๋ก ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ , ํ์ง๋ง ์ํ์ฑ ์์|์ด ๊ฒฝ์ฐ๋ Swift runtime์ dependency ์ ๋ณด๋ฅผ ์จ๊ธฐ๊ธฐ ๋๋ฌธ์ ์์ ํ์ง ์๋ค.|
Task boundary๋ฅผ ๋์ด awaitํ๋ ๋ถ์์ ํ ์์ ํ์ ์ ์ฌ์ฉํ์ง ๋ง๋ผ. ํนํ semaphore๋ ๋ถ์์ ํ ์์ํ์ ์ ํตํด ๊ตฌ์กฐํ๋์ง ์์ task๋ฅผ ๋ง๋๋๋ฐ ์ฌ์ฉํ์ง ๋ง๋ผ.
๋ฑ deadlock ๋ฐ์ํ๊ธฐ ์ข์ ์ฝ๋๋ค. Task๊ฐ ๋ค์ด๊ฐ ํน์ thread์์ unblockํ๊ธฐ ์ ๊น์ง ํน์ thread๊ฐ ๋ฌดํ ๋๊ธฐํ ์ ์๋ค. ์ด๋ ๊ฒ ๋๋ฉด runtime contract๋ฅผ ์๋ฐํ ๊ฒ์ด๋ค. ๋ค์ ์์ ์ ์ด์ด๋๊ฐ ์ ์๋๋ก ๋ง๋ค์๊ธฐ ๋๋ฌธ์ด๋ค.
Synchronization via Actor
์ด์ ์ ์์๋ณธ Actor๋ concurrentํ ์ ๊ทผ์ ๋ํด mutable state๋ฅผ ์ด๋ป๊ฒ actor๊ฐ ๋ฐฉ์ดํ๋์ง์ ๋ํด์ ์์๋ณด์๋ค. Actor๊ฐ ์ํธ๋ฐฐ์ ๋ฅผ ๋ณด์ฅํ๋ค๋ ๊ฒ์ ๊ธฐ์ตํด๋ณด์.
Mutual exclusion
์์์ ์ฌ์ฉํ๋ databaseQueue
์ ๋๊ฒผ๋ ๋์์ ์๊ฐํด๋ณด์.
|Comparison|1๏ธโฃ
Locks,
Serial Queue sync { โฆ}|2๏ธโฃ
Serial Queue async (โฆ }|3๏ธโฃ
Actors using cooperative pool|
|:--------:|:----------------------------------:----|:------------------------------:----|:--------------------------------:----|
|No contention (the queue is not already running)|โ
Reuse thread|โ ๏ธ Request new thread|โ
Reuse thread|
|Under contention (the queue is already running)|๐ Blocking|โ
Non-blocking|โ
Non-blocking|
๋จผ์ , Queue๊ฐ ๋์์ค์ด ์๋๋ผ๋ฉด, ์ฆ ๊ฒฝ์์ํ๊ฐ ์๋๋ผ๋ฉด ์๋ฌด๋ฐ ๋ฌธ์ ์๋ค. ํ์ฌ ๋์ํ๊ณ ์๋ Thread๋ฅผ ์ฌ์ฌ์ฉํ์ฌ ์์
ํ๋ค. ๊ทธ๋ฐ๋ฐ Serial Queue๊ฐ ์ด๋ฏธ ๋์์ค์ด๋ค. ์ฆ, ๊ฒฝ์ ์ํ๋ค. ์ด๋ฐ ๊ฒฝ์ฐ ํธ์ถํ๋ thread(databaseQueue.sync
๋ฅผ ํธ์ถํ๋ thread)๋ block๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด blocking ๋์์ด ๋ฐ๋ก thread explosion์ ๋ฐ์์ํค๋ ํ๋์ด๋ค.
blocking์ ๋ฌธ์ ๋๋ฌธ์, ์ผ๋ฐ์ ์ผ๋ก ์ฐ๋ฆฌ๋ dispatch async๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ์ถ์ฒํ๋ค. dispatch async์ ์ฃผ์ ์ด์ ์, non-blocking์ด๋ผ๋ ๊ฒ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๊ฒฝ์ ์ํ์ ๋์ด๋๋ผ๋ thread explosion์ด ๋ฐ์ํ์ง ์๋๋ค. (๋ฐ๋ก thread๊ฐ ์ฌ๋ผ์ง๊ณ ์์ ๋ง ๋ค์ ์ถ๊ฐ๋๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ) dispatch serial queue async์ ๋จ์ ์ผ๋ก๋ ๊ฒฝ์์ด ์๋ ๊ฒฝ์ฐ ํธ์ถํ ์ค๋ ๋๊ฐ ๊ณ์ ๋ค๋ฅธ ์์ ์ ์ํํ๋ ๋์ Dispatch๊ฐ ๋น๋๊ธฐ ์์ ์ ์ํํ๊ธฐ ์ํด ์ ์ค๋ ๋๋ฅผ ์์ฒญํด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก dispatch async์ ๋น๋ฒํ ์ฌ์ฉ์, ๊ณผ๋ํ thread wakeup๊ณผ context switching์ ๊ฐ์ ธ์ฌ ์ ์๋ค.
์ด๋ฌํ ํ์์ฑ์์ Actor๊ฐ ๋์๋ค. Swift์ Actor๋ ํจ์จ์ ์ธ ์ค์ผ์ค๋ง์ ์ํด Cooperative thread pool์ ํ์ฉํ์ฌ ๋ ์ธ๊ณ์ ์ฅ์ ์ ๊ฒฐํฉํ๋ค. ์คํ ์ค์ด ์๋ Actor์์ method๋ฅผ ํธ์ถํ ๋ ํธ์ถํ ์ค๋ ๋๋ฅผ ๋ค์ ์ฌ์ฉํ์ฌ ๋ฉ์๋ ํธ์ถ์ ์คํํ ์ ์๋ค. ๋์ํ๊ณ ์๋ ์ํฉ์ด๋ผ๋ฉด ํธ์ถํ thread๋ ๋์์ suspendํ๊ณ ๋ค๋ฅธ ์์ ์ ๊ฐ์ ธ์์ ์คํํ๋ค.
Actor hopping
actor๊ฐ ์ด๋ป๊ฒ ๋์ํ๋์ง ํ๋ฒ ์ดํด๋ณด์.
news feed๋ฅผ ๋ง๋๋ ์ฑ์์, database์ networking์ ์ฒ๋ฆฌํ๋ subsystem์ ์ดํด๋ณด์.
Swift concurrency๋ก ๋์ด์ค๋ฉด, GCD์์ ์๋ serial queue๋ Database Actor๋ก ๋ฐ๋๋ค. ๊ทธ๋ฆฌ๊ณ Concurrent Queue๋ ๊ฐ๊ฐ์ ํด๋น๋๋ Actor๋ก ๋ฐ๋๋ค.
์ด ๋ชจ๋ Actor๋ค์ Cooperative thread pool์์ ๋์ํ๋ค. feed actor๋ article ์ ์ฅ, ๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ๋ชฉ์ ๋ค์ ์ํด database actor์ ์ํธ์์ฉํ๋ค. ์ด๊ฑธ actor hopping process๋ผ ํ๋ค. ์ด hopping process๊ฐ ์ด๋ป๊ฒ ์ผ์ด๋๋์ง ์์๋ณด์.
sports feed๋ฅผ ์ํ actor๊ฐ cooperative thread์์์ ๋์ํ๊ณ ์๋ค๊ณ ์๊ฐํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ์ด feed๋ ๋ช article์ database์ ์ ์ฅํ๊ณ ์ถ๋ค. ๊ทธ๋ฆฌ๊ณ database actor๋ ์์ง ์ฌ์ฉ๋ ์ ์ด ์๋ค๊ณ ์๊ฐํด๋ณด์. ์ฆ, untended case์ด๋ค.
Thread๋ ์ง์ ์ ์ผ๋ก sports feed actor์์ database actor๋ก hoppingํ ์ ์๋ค. ์ฌ๊ธฐ์ ์ฃผ๋ชฉํด์ผ ํ๋ ์ ์ ๋๊ฐ์ง์ด๋ค.
- hopping actor์์ thread๋ block๋์ง ์์๋ค.
- hopping์ ํ๋๋ฐ ์์ด ๋ค๋ฅธ thread๊ฐ ํ์์๋ค.
runtime์์ ์ง์ ์ ์ผ๋ก sport feed actor๋ฅผ ์ํด work item์ suspendํ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ database actor๋ฅผ ์ํด ์๋ก์ด work item์ ๋ง๋ค ์๋ ์๋ค.
database actor๊ฐ ์ด๋์ ๋ ์คํ๋์์ง๋ง, ์ฒซ๋ฒ์งธ work item์ ์คํ์ด ๋ชจ๋ ๋๋์ง๋ ์์๋ค๊ณ ํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ์ด์๊ฐ์ weather feed actor๊ฐ ๋ช article์ database์ ์ ์ฅํ๋ ค๊ณ ์๋ํ๋ ์ํฉ์ ์๊ฐํด๋ณด์.
์ด๋ฐ ๊ฒฝ์ฐ, database actor๋ฅผ ์ํด ์๋ก์ด work item์ด ์์ฑ๋๋ค. actor๋ ์ํธ๋ฐฐ์ ๋ ๋ณด์ฅํ๊ธฐ ๋๋ฌธ์, ๊ธฐ๊ปํด์ผ ํ๋์ work item๋ง ์ฃผ์ด์ง ์๊ฐ์ ํ์ฑํ ๋๋ค.
actor ์ญ์ non-blocking์ด๊ธฐ ๋๋ฌธ์, ์ด์ ๊ฐ์ ์ํฉ์์ weather feed์ ๊ฒฝ์ฐ suspend๋ ๊ฒ์ด๋ค. ๊ทธ๋ฆฌ๊ณ thread๋ ์ด์ freed ์ํ์ด๊ธฐ ๋๋ฌธ์ ๋ค๋ฅธ ์์ ์ ์ํํ ์ ์๋ค.
์ด๋์ ๋ ์๊ฐ์ด ์ง๋ ํ์, ์ต์ด database ์์ฒญ(D1)์ด ์๋ฃ๋์๊ณ , database actor์ ์๋ ํ์ฑํ๋ work item์ ์ ๊ฑฐ๋๋ค.
runtime์ ๋ค์์ผ๋ก ์ง์ฐ๋์ด ์๋ work item์ธ D2๋ฅผ ์์ํ๋ค.
๋๋ feed actors ๋ฑ ์ค ํ๋๋ฅผ ๊ณจ๋ผ ์ฌ๊ฐํ ์๋ ์๋ค. ํน์ ๋ค๋ฅธ work๋ฅผ ๊ฐ์ ธ์ freed ๋ thread์์ ์์ ์ ์คํํ ์๋ ์๋ค.
Reentrancy and prioritization
- ๋น๋๊ธฐ ์์ ์ด ๋ง๊ฑฐ๋
- contention์ด ๋ง์ด ์ด๋ฃจ์ด์ง๊ณ ์๊ฑฐ๋
์์ ๋๊ฐ์ง ์ํฉ์์ system์ ์ด๋ค work๊ฐ ๋ ์ค์ํ์ง์ ๋ํด์ ํ๋จํด์ผ ํ๋ค. ์ด์์ ์ผ๋ก user interaction๊ณผ ๊ฐ์ด ์ต์ฐ์ ์์์ work๊ฐ backup๊ณผ ๊ฐ์ work์ ๋นํด ์ฐ์ ์ ์ผ๋ก ์งํ๋๋ ๊ฒ์ด ์ข๋ค.
Actor๋ Reentrancy(์ฌ์ง์ )์ด๋ผ๋ ๊ฐ๋ ๋๋ฌธ์ ์์คํ ์ด work์ ์ฐ์ ์์๋ฅผ ์ ์ ํ ์ ์๋๋ก ์ค๊ณ๋์๋ค. ๊ทธ ์ ์, ์ reentrancy๊ฐ ์ฌ๊ธฐ์ ์ค์ํ์ง ๋ถํฐ ์์๋ณด์.
Serial dispatch queues
๋น์ฅ ํ๋ฉด์ ํ์๋๋ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ์ฐ์ ์์๊ฐ ๋์ ์์ ์ database์๊ฒ ์์ฒญํ๋ค๊ณ ์๊ฐํด๋ณด์. ๊ทธ๋ฆฌ๊ณ ๋ค์์ผ๋ก๋ iCloud์ backup์ ํ๋ ์ฐ์ ์์์์ ์๋์ ์ผ๋ก ๋ฐ๋ฆฌ๋ ์์ ์ ์์ฒญํ์. ๊ทธ๋ฌ๋ฉด ์์ฒญ์ ํ ์์๋๋ก serial queue์ ์์ ๊ฐ์ด ์์ด๊ฒ ๋ ๊ฒ์ด๋ค.
DispatchQueue๋ FIFO ์์๋ก ์ฒ๋ฆฌํ๊ธฐ ๋๋ฌธ์ ๋ค์ด๊ฐ ์์๋๋ก ์์ฐจ์ ์ผ๋ก ์ฒ๋ฆฌ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ๋ง์ ๊ณง item A๊ฐ ์คํ๋๊ณ ๋ ํ, ๋ฎ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ 5๊ฐ์ item์ด 6๋ฒ์จฐ ์์นํ ๋์ ์ฐ์ ์์ item๋ณด๋ค ๋จผ์ ์คํ๋์ด์ผ ํจ์ ๋ปํ๋ค. ์ด๋ฅผ ์ฐ์ ์์ ์ญ์ ์ด๋ผ ํ๋ค.
Serial Queue๋ ๋์ ์ฐ์ ์์ ์์ ๋ณด๋ค ์์ ์๋ Queue์ ๋ชจ๋ ์์ ์ ์ฐ์ ์์๋ฅผ ๋์์ผ๋ก์จ ์ฐ์ ์์ ์ญ์ ์ ๋ฐฉ์งํ๋ค. ์ฆ, ์ด ๋ง์ queue์์ ์๋ work๋ค์ด ๋ ๋นจ๋ฆฌ ์๋ฃ๋จ์ ๋งํ๋ค.
ํ์ง๋ง ์ด ๋ฐฉ๋ฒ์ 1์์ 5๊น์ง ์์๊ฐ B๋ณด๋ค ๋จผ์ ์๋ฃ๋์ด์ผ ํ๋ค๋ ์ ์์ main issue๋ฅผ ํด๊ฒฐํ์ง๋ ๋ชปํ๋ค. ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ๋นก๋นกํ FIFO ๊ท์ ์ ๋ฒ๋ ค์ผ ํ๋ค. ์ด๋ฌํ ๋ฌธ์ ์ ์์ actor reentrancy๊ฐ ๊ณ ์๋์๋ค.
Actor reentrancy
database actor๊ฐ thread์์์ ๋์ํ๊ณ ์๋ค ์๊ฐํด๋ณด์.
database actor๋ suspend ๋์๊ณ , ๊ทธ ์๋ฆฌ๋ฅผ sports feed actor๊ฐ ์ฐจ์งํ๋ค๊ณ ์๊ฐํด๋ณด์.
sports feed actor๋ ์ผ๋ง ์ง๋์ง ์์ ๋์์ ์๋ฃํ๊ณ , database actor์๊ฒ article์ ์ ์ฅํด๋ฌ๋ผ๊ณ ์์ฒญํ๋ค. database actor๋ uncontended(์ค์ ๋์ํ๊ณ ์์ง ์์, ๊ฒฝ์ X) ์ํ์ด๊ธฐ ๋๋ฌธ์, pendingํ ์์ (D1)์ด ์์์๋ thread๋ database actor๋ฅผ hoppingํ ์ ์๋ค.
save
์์
์ ํ๊ธฐ ์ํด์๋ ์๋ก์ด work item์ด database actor๋ฅผ ์ํด ์์ฑ๋์ด์ผ ํ๋ค. ์ด๊ฑธ actor reentrancy๋ผ ํ๋ค.
actor์ ์ฌ๋ ค์ง ์๋ก์ด work item์ด ํ๋ ํน์ ํ๋ ์ด์์ ์ด์ ์์ ์ด suspend๋ ์ํ์์ ์์ผ๋ก ์งํํ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ๋ ๋์์ actor reentrancy๋ผ ํ๋ค.
actor๋ ์ฌ์ ํ ์ํธ๋ฐฐ์ ๋ฅผ ๋ง์กฑํ๋ค. ๊ธฐ๊ปํด์ผ ํ๋์ item๋ง์ด ํด๋น ์๊ฐ์ ์คํ๋ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋์ ๋ ์๊ฐ์ด ์ง๋ ํ์, D2๋ ์คํ์ ๋ง์น๋ค. D2๊ฐ D1๋ณด๋ค ๋์ค์ ์์ฑ๋์์์๋ ๋ถ๊ตฌํ๊ณ ๋จผ์ ์์ ์ ๋๋์ณค๋ค๋ ๊ฒ์ ์ฃผ๋ชฉํ์. ๊ทธ๋ฌ๋ฏ๋ก, actor reentrancy๋ฅผ ์ง์ํ๋ค๋ ๋ง์ actor๊ฐ ์๊ฒฉํ FIFO ์์๋ฅผ ๋ฐ๋ฅด์ง ์๋ ๋ฐฉ์์ผ๋ก item์ ์คํํ ์ ์์์ ๋ปํ๋ค.
Actor reprioritization
์ด๋ฐ actor reentrancy๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฐ์ ์์๊ฐ ๊ฑธ๋ฆฐ ์์ ์ด ์ด๋ป๊ฒ ์ด๋ฃจ์ด์ง๋ ์ง ํ์ธํด๋ณด์.
๋จผ์ , ๊ฐ์ฅ ์ฐ์ ์์๊ฐ ๋์ A item์ด ์คํ๋ ๊ฒ์ด๋ค.
actor reentrancy์ ๋ฐ๋ผ runtime์ ์ต์ฐ์ ์์ work item์ queue์ ์ต์๋จ์ผ๋ก ์ฎ๊ธด๋ค.
์ด๋ ์ฐ์ ์์ ์ญ์ ๋ฌธ์ ๋ฅผ ์ง์ ํด๊ฒฐํ์ฌ ๋ณด๋ค ํจ๊ณผ์ ์ธ ์ค์ผ์ค๋ง๊ณผ ๋ฆฌ์์ค ํ์ฉ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
Main actor
๋ง์ง๋ง์ผ๋ก ๋ค๋ฅธ ์ข ๋ฅ์ actor๊ฐ ์๋ค. main actor๋ ์์คํ ์ ๊ธฐ์กด ๊ฐ๋ ์ธ ๋ฉ์ธ ์ค๋ ๋๋ฅผ ์ถ์ํํ๊ธฐ ๋๋ฌธ์ ๋ค์ ๋ค๋ฅด๋ค.
๋ค์ actor๋ฅผ ์ฌ์ฉํ news feed๋ฅผ ๋ฐ์์ค๋ app์ ๋ ์ฌ๋ ค๋ณด์. user interface๋ฅผ ์ ๋ฐ์ดํธ ํ ๋, ์ฐ๋ฆฌ๋ main actor๋ฅผ ํ์ฉํด์ผ ํ๋ค. cooperative pool์์ ์๋ thread๋ก๋ถํฐ main thread๋ ๋ถ๋ฆฌ๋์ด ์๊ธฐ ๋๋ฌธ์ด๋ค. ๊ทธ๋ฆฌ๊ณ ์ด ์์ ์ context switching์ ์ํ๋ค.
database๋ก๋ถํฐ article์ ๋ก๋ํ๊ณ ๊ฐ ๊ธฐ์ฌ์ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ ์์ ์ฝ๋๋ฅผ ๋ณด์. ๊ฐ๊ฐ์ loop์์ ์ ์ด๋ ๋๋ฒ์ context switching์ด ์ผ์ด๋๋ค.
- main actor์์ database actor๋ก
- database actor์์ main actor๋ก
๋ฃจํ ๋ฐ๋ณต ํ์๊ฐ ์ ๊ณ ๊ฐ ๋ฐ๋ณต์์ ์๋นํ ์์ ์ด ์ํ๋๊ณ ์๋ค๋ฉด ๊ด์ฐฎ์ ์ ์๋ค. ํ์ง๋ง ์คํ์ด main actor๋ฅผ ์์ฃผ ์ค๊ฐ๋ ๊ฒฝ์ฐ thread ์ ํ์ ์ค๋ฒํค๋๊ฐ ๋์ ๋๊ธฐ ์์ํ ์ ์๋ค.
ํ๋ก๊ทธ๋จ์ด ์ปจํ ์คํธ ์ ํ์ ๋ง์ ์๊ฐ์ ์๋นํ๋ค๋ฉด, main actor์ ๋ํ ์์ ์ด ์ผ๊ด ์ฒ๋ฆฌ๋๋๋ก ์ฝ๋ ๊ตฌ์ฑ์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
cooperative pool์์ actor๋ค ๊ฐ์ hopping์ ๋น ๋ฅด์ง๋ง, ์ฑ์ ์์ฑํ ๋๋ ์ฌ์ ํ main actor์์ hopping๋ฅผ ์ผ๋์ ๋์ด์ผ ํ๋ค.
๋ง์น๋ฉฐ
Swift concurrency๋ ์ฑ๋ฅ, ๊ฐ๋ ์ฑ, ์์ ์ฑ์ ๋ชจ๋ ๊ณ ๋ คํ ๋ฐฉ๋ฒ์ด๋ค.
await
๊ทผ์ฒ์์๋ suspension์ด ์ผ์ด๋๋ค.- Thread์ blocking์ด ์์ผ๋ฉฐ, asyncํ๊ฒ ๋์ํ๋ ๊ฒฝ์ฐ heap์ ๋ค์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
- ๊ทธ๋ ๊ธฐ์ thread์ ๋์์ด ๋์์ฌ ๋ ๊ฐ์ thread๋ผ๋ ๋ณด์ฅ์ด ์๋ค.
- actor๋ ์ํธ๋ฐฐ์ ๋ฅผ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ด๋ค.
- ์ ์ฐํ FIFO ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ, ์ฐ์ ์์ ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค.
- main actor๋ main thread์ ๊ด๋ จ์๋ค.