- Published on
๐ Swift - Concurrency
- Authors
- Name
- ์ด์ฐฝ์ค
Concurrency
WWDC21์ ์ฃผ์ ์ฃผ์ ๋ Concurrency๋ผ๊ณ ์๊ฐํฉ๋๋ค.
21๋ ์ ์ฒ์ ๊ณต๊ฐ๋ ํ ๊ด๋ จ๋ ํฌ์คํธ๋ ๋ง์์ก๊ณ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์๋ ๋์ ์ ๋ฐ์ดํธ๊ฐ ๋ง์ด ์ด๋ฃจ์ด์ง ์ํฉ์ ๋๋ค.
์ด์ ์ฌ์ฌ ์ค๋ฌด์ ์ฌ์ฉ๋๋ ๋ชจ์ต๋ค๋ ๋ณด์ด๊ธฐ ์์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์ด๋ ดํ์ด โasync
์ await
๋ฅผ ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์ด๋ค.โ ์ ๋๋ก๋ง ์์๋๊ณ ๋์ค์ ๊ณต๋ถํด์ผ๊ฒ ๋ค ์๊ฐํ์ง๋ง ํ๋ก์ ํธ์์ callback
์ง์ฅ์ ๋ณธ ์๊ฐ.. ํ๊ตฌ์ด์ด ์ฌ๋ผ ํ ๋ฒ ํ์ตํด๋ดค์ต๋๋ค.
WWDC21์ ์ธ์ ๋ค์ ์ดํด๋ณด์๋๋ ๊ด๋ จ ์ธ์ ๋ง ๊ฑฐ์ 10๊ฐ์ ๋ฌํ๊ณ ํ๋ํ๋์ ๋ด์ฉ๋ค๋ ๊ฝ ์ฐฌ 20~30๋ถ ์ ๋๋ฅผ ์ด๋ฃจ๊ณ ์๋๊ตฐ์..
๊ทธ๋์ ๋ด์ฉ์ด ๋ฌด์ง๋ฌด์ง ๋ง์ต๋๋ค.. ๐ซ
๋น๋๊ธฐ ํ๋ก๊ทธ๋๋ฐ
๋น๋๊ธฐ ์ฝ๋๋ โ๋์ค์ ์ธ์ ๊ฐ ํธ์ถ๋์ด ์คํ๋ ์ฝ๋โ ์ ๋๋ค.
๊ทธ ์๊ธฐ๋ ๋ณด์ฅ๋์ง ์์ผ๋ฉฐ ์์ ๋ํ ๋ณด์ฅ๋์ง ์์ ๋๋ ์์ต๋๋ค.
Swift์์๋ ์ฐ๋ฆฌ๊ฐ ํํ GCD๋ผ๊ณ ๋ถ๋ฅด๋ DispatchQueue
๋ฅผ ํตํด ์ง์ํ๋ ๊ฐ๋
์ด์์ฃ .
print("1")
DispatchQueue.main.async {
print("2")
}
print("3")
์ ์ฝ๋์ print("2")
๊ตฌ๋ฌธ์ ๋น๋๊ธฐ ์ฝ๋์
๋๋ค.
๋ฐ๋ผ์ ์์์ ํธ์ถ ์๊ธฐ๊ฐ ๋ถํ์คํฉ๋๋ค.
๋ฐ๋ก ํธ์ถ๋ ์๋ ์๊ณ ์๋์๋ ์์ฃ .
1 2 3
1 3 2
๊ทธ๋์ ์์ ๊ฐ์ด ์คํ๋ง๋ค ๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅผ์๋ ์์ต๋๋ค.
๋น๋๊ธฐ์ฝ๋๋ 1. ํด๋น ๋ผ์ธ์ ๋๋ฌ๋๋ ๋ฐ๋ก ์คํ๋์ง ์๊ณ , 2. ์ดํ์ ์๋ ์ฝ๋์ ์คํ์ Blockingํ์ง๋ ์์ต๋๋ค.
๋น๋๊ธฐ ์ฝ๋๊ฐ ์ธ์ ์คํ๋๋์ง ๋ชจ๋ฅธ๋ค๋ฉด, ๋น๋๊ธฐ์ ์ผ๋ก ์ฐ์ถ๋ ์ด๋ค ๊ฐ์ ์ธ์ ์ฌ์ฉํด์ผ ํ ๊น์?
๋คํํ๋ ๋น๋๊ธฐ ์ฝ๋๊ฐ ์ข ๋ฃ๋๋ ์์ ์ ์ฐ๋ฆฌ๊ฐ ์ ์ ์์ต๋๋ค.
@escaping
ํด๋ก์ ๋ฅผ ํตํด์์.
func foo() {
print("1")
asyncFoo(completion: { value in
print(value)
})
print("3")
}
func asyncFoo(completion: @escaping (String) -> Void) {
DispatchQueue.main.async {
let a = "2"
completion(a)
}
}
asyncFoo
๋ฉ์๋์์ completion
ํด๋ก์ ๋ async
ํจ์๊ฐ ์ข
๋ฃ๋๋ ์์ ์ ํธ์ถ๋์ด ์ฝ๋ฌ์ธ foo
๋ฉ์๋์ String
ํ์
ํ๋ผ๋ฏธํฐ value
๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ด๋ฐ ๋ฐฉ์์ ๋ฌธ๋ฒ์ ์ด๋ค ํจ์๊ฐ ๋๋ฌ์ ๋์ ๋์๋ค์ ๋ฌถ์์ ๋ช
์์ ์ผ๋ก ๋ชจ์๋ ์ ์๋ค๋ ์ฅ์ ์ด ์์ง๋ง (์ฅ์ ์ธ๊ฐ..?) callback
์ง์ฅ๊ณผ ์ฝ๋ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง๋ค๋ ๋ฌธ์ ์ ์ ๊ฐ์ง๋๋ค.
GCD์ ์ง์ง ๋ฌธ์ ์
์ฝ๋์ ๊ฐ๋ ์ฑ๊ณผ ๊ฐ๋ฐ์์๊ฒ ์ฃผ๋ ๋ถ์พํ ๊ฒฝํ๋ ์ค์ํ์ง๋ง GCD์๋ ๋์ฑ ํฌ๋ฆฌํฐ์ปฌํ ๋จ์ ์ด ์กด์ฌํฉ๋๋ค.
๋ฐ๋ก CPU์ ๋ถํ์ํ ์ถ๊ฐ ๋์๊ณผ ๊ณผ๋ํ ๋ฆฌ์์ค์ ์ฌ์ฉ์ ์ ๋ฐํ ์ ์๋ค๋ ์ ์ ๋๋ค.
์ด๊ฒ ๋ฌด์จ ๋ง์ธ์ง ์ดํด๋ณผ๊น์?
DispatchQueue์ ๋์์ด enqueue๋๋ฉด, ์์คํ ์ ํด๋น ์์ ์ด ์ํ๋ ์ฐ๋ ๋๋ฅผ ๋ถ๋ฌ์ค๊ณ ์ํ์ํต๋๋ค.
๋ง์ฝ ๋ฌด์ํ ๋ง์ ๋์๋ค์ด enqueue๋๋ฉด, ์์คํ ์ ํด๋น ๋์๋ค์ ๋์์ ์ํํ๊ธฐ ์ํด ์ฐ๋ ๋๋ฅผ ๊ณ์ํด์ ๋ถ๋ฌ์ต๋๋ค. CPU์ ์ฝ์ด๊ฐ ๋ ์ด์์ ์ฐ๋ ๋ ์์ ์ ์ถ๊ฐํ ์ ์์ ๋๊น์ง์.
์ฝ์ด๊ฐ 2๊ฐ์ธ ํ๊ฒฝ์์ ์ฐ๋ ๋๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ๋ถ๋ฌ์ค๋ ์ํฉ
ํ๋์ ์ฝ์ด๊ฐ ์ฌ๋ฌ๊ฐ์ ์ฐ๋ ๋๋ฅผ ๊ฐ์ง๊ณ ์๋ ์ด์ ๋ ์ฌ๋ฌ๊ฐ์ง์ ๋๋ค.
- ํ๋์ ์ฐ๋ ๋๊ฐ Block๋๋๋ผ๋ ์ฝ์ด๊ฐ ์ฌ์ง์๊ณ ๋ค๋ฅธ ์ฐ๋ ๋์ ์์ ์ ํ ์ ์๋๋ก ํ๊ธฐ ์ํด
- ์ฐ๋ ๋๊ฐ์ Race Condition์ ํด๊ฒฐํ๊ธฐ ์ํด (Semaphore ์ฐธ๊ณ )
๊ทธ๋ฐ๋ฐ ๊ณผ์ฐ Blocking๋ ์ฐ๋ ๋๊ฐ ๋ง์์ง๋ค๊ณ ์ฐ๋ ๋๋ฅผ ๋ฌด์ํ ๋ง์ด ๋ถ๋ฌ์ค๋ ๊ฒ์ด ํญ์ ์ข์๊น์?
๋น์ฐํ ์๋๊ฒ ์ฃ ..
์ฐ๋ ๋๋ค์ด Blocking๋ ์ํ์์ ์ถ๊ฐ์ ์ผ๋ก ์ฐ๋ ๋๋ฅผ ๊ณ์ ๋ถ๋ฌ์จ๋ค๋ฉด, ๋ ์ด์ ์ฝ์ด๊ฐ ์ฐ๋ ๋๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ ์ํ๊ฐ ๋ฉ๋๋ค.
ํด๋น ํ์์ Thread Explosion์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
Swift๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด
DispatchSemaphore
์ ๊ฐ์ ๊ธฐ๋ฅ์ ์ ๊ณตํ๊ณ ์๊ธฐ๋ ํฉ๋๋ค. ๋ฌธ์ ๋ ์ฌ์ฉํ๊ธฐ์ ๋๋ฌด ๋ฒ๊ฑฐ๋กญ๋ค๋ ๊ฒ์ด์ฃ ..!
Thread Explosion ํ์์ด ๋ฐ์ํ๋ฉด OS๋ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ๋ง์ฃผ์นฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํค๋
Block๋ ์ฐ๋ ๋๋ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ๊ณ ์์ต๋๋ค. ๋ค๋ฅธ ์ฐ๋ ๋์ unlock์ ์ํด ํ์ํ ๋ฆฌ์์ค๋ฅผ ์ ๊ฑฐํ๊ณ ์์ ์๋ ์์ฃ .
- ์ค์ผ์ค๋ง ์ค๋ฒํค๋
CPU์ ์ฝ์ด๋ ์ฐ๋ ๋๊ฐ์ ์ ํ์ ์ํด ์ปจํ ์คํธ ์ค์์นญ(Context Switching) ์ด๋ผ๋ ์์ ์ ์ํํด์ผ ํฉ๋๋ค. ์ฐ๋ ๋๊ฐ ํญ๋ฐ์ ์ผ๋ก ๋ง์์ง๋ฉด ์ปจํ ์คํธ ์ค์์นญ๋ ๋น๋ฒํ ์ผ์ด๋ ๋ถํ์ํ ์์ ์ด ๋์ด๋ฉ๋๋ค.
์ ๊ทธ๋์ Swift๋ ์ด๋ฐ ํ์์ ์ด๋ป๊ฒ ํด๊ฒฐํ๋๋?
async / await
์๋ก์ด Swift์ asynchronous ๊ฐ๋
async
/ await
์ concurrency๋ฅผ ํตํด์์ฃ .
์ค์ ๋ฉํฐ ์ฐ๋ ๋ฉ์ ์ด๋ฌํ ์ค๋ฒํค๋๋ค์ ์ด์ ๋ถํฐ ๋ค์ํ ์ธ์ด์ ์ด์์ฒด์ ์ ๋ฌธ๊ฐ๋ค์๊ฒ ๋ฌธ์ ์ ๋์ด์์ต๋๋ค.
์ด๋ค์ด ์ ์ํ ๋ฐฉ๋ฒ์ ๋ฐ๋ก Coroutine ๋ฐฉ์์ด์์ต๋๋ค.
์ค๋์ ๋ฉํฐ์ฐ๋ ๋ฉ ๋ฐฉ์์ด ์ ์๋๊ณ ํต์ฉ๋๊ธฐ ์์ํ๋ฉฐ ์์ฐ์ค๋ฝ๊ฒ ๋ฒ๋ ค์ก๋ Coroutine ๋ฐฉ์์ด ํ๋์ ์์ ๋ค์ ์ฐ๊ตฌ๋๊ณ ๋ฐ์ ํ๊ณ ์์ฃ .
์ค์ ๋ก Python, Kotlin๊ณผ ๊ฐ์ ์ธ์ด๋ค์ด ์ ๊ทน์ ์ผ๋ก Coroutine ๋ฐฉ์์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค.
๊ทธ๋์ Coroutine ๋ฐฉ์์ ์ด๋ค ๋ฐฉ์์ด๋?
์ฝ๋ฃจํด(Coroutine) ์ CPU์ ์ฝ์ด ๊ฐ์๋งํผ๋ง ์ฐ๋ ๋๋ฅผ ๋ง๋ค๊ณ ์ฐ๋ ๋๋ฅผ ์ฐจ๋จํ๋ ๋์ ์์ ์ ๋ง์๋ ์ผ๋ก์จ ์ปจํ ์คํธ ์ค์์นญ์ ์ฐจ๋จํฉ๋๋ค.
Swift ์ฉ์ด๋ก ๋ฐ๊พธ์ด๋ณผ๊น์?
Swift Concurrency๋ ์ฐ๋ ๋์ ์ฐจ๋จ(Blocking)์ ์์ ๊ณ ์์
์ ์ฌ์คํ(Resumption of Work)๋ฅผ ์ถ์ ํ๋ continuation
์ด๋ผ๋ ๊ฐ์ฒด๋ฅผ ํตํด Context Switching ๋์ ๊ฐ์ ์ฐ๋ ๋ ๋ด์์ Continuation Switching์ ์ํํ์ฌ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ์ง์ํฉ๋๋ค.
์ Concurrency๊ฐ (๋ชจ์์ ์ด๊ฒ๋) ํ๋์ ์ด๊ณ ์ข๋ค๋ ๊ฑด ์์์ด์.
๊ทธ๋์ async
/ await์
์ด๋ป๊ฒ ์ฌ์ฉํ ๊น์? ๐
WWDC์์๋ ์ฌ์ฉํ ๊ธฐ์กด์ @escaping
ํด๋ก์ ๋ฅผ ์ฌ์ฉํ๋ ์์๋ฅผ ๊ฐ์ ธ์๋ดค์ด์.
์์คํ
์ ์ธ ๋จ์ ๋ง๊ณ ์ฝ๋ ์์ฑ์ ์ธก๋ฉด์์ @escaping
ํด๋ก์ ๋ฐฉ์์ ์ธ๊ฐ์ง ๋จ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค.
completion
ํด๋ก์ ํธ์ถ์ ๊น๋จน๊ธฐ ์ฝ์ต๋๋ค. (์ฌ๋ฌ๊ตฐ๋ฐ์ ํ์)- callback์ด ์ค์ฒฉํด์ ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
- ์ฝ๋ ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๋๋ค.
์ ๊ทธ๋ฐ๋ฐ async
/ await๋ฅผ
์ฌ์ฉํ ์ฝ๋๋ก ๋ฐ๊ฟ๋ณด๋ฉด์?
์์ฒญ ์งง์์ง๊ณ ์๋ง์๋ ์ค๊ดํธ๋ค์ด ์ฌ๋ผ์ก์ด์! ๐
async
ํจ์์ ํ๋ผ๋ฏธํฐ์ ๋ฐํํ์
์ค๊ฐ์ async
๋ฅผ ๋ถ์ฌ์ค์ผ๋ก์จ ํด๋น ํจ์๊ฐ ๋น๋๊ธฐ์ ์ด๋ค ๋ผ๋ ๊ฒ์ ๋ํ๋ด์ค๋๋ค!
throws
๋ฅผ ํตํด ํด๋น ํจ์๊ฐ ์๋ฌ๋ฅผ ๋ฐฉ์ถํ ์ ์๋ค๋ผ๋ ๊ฒ๋ ํจ๊ป ๋ช
์ํด์ค ์ ์์ต๋๋ค.
await
async
๋ก ์ ์๋ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด์๋ Concurrent Context ๋ด๋ถ์์ await
ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ด์ผ ํฉ๋๋ค.
let (data, response) = try await URLSession.shared.data(for: request)
์ฃผ์ํ ์ ์ ์ ์ํ ๋๋ ์์๊ฐ async throws
์ง๋ง, ์ฌ์ฉํ ๋๋ try await
์์๋ผ๋ ๊ฒ์ ์์๋์ด์ผํฉ๋๋ค.
await
ํค์๋๋ ํด๋น ๋ผ์ธ์ด Suspension Point๋ผ๋ ๊ฒ์ ๋ช
์ํ๋ ์ญํ ์ ํฉ๋๋ค.
Suspend
await
ํฌ์ธํธ๋ฅผ ๋ง๋๋ฉด ๋๋ค๋ Suspend๋ ๋ ๋ญ๊น์?
Suspend๋ โํด๋น ์ค๋ ๋๊ฐ ๋ค๋ฅธ ๋์์ ์ํํ ์ ์๋๋ก ์ค๋ ๋์ ํต์ ๊ถ์ ์์คํ ์๊ฒ ๋๊ฒจ์ค๋คโ ๋ผ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ผ๋ฐ์ ์ธ synchronousํ ์ฝ๋์ ๊ฒฝ์ฐ์๋ ์์ ๊ฐ์ด ๋์ํฉ๋๋ค.
fetchThumbnail
ํจ์์์ thumbnailURLRequest
ํจ์๋ฅผ ํธ์ถํ๊ณ ์์ต๋๋ค.
์ด ๋ ๋ ํจ์ ๋ชจ๋ sync ํจ์์ด๊ธฐ ๋๋ฌธ์ fetchThumbnail
ํจ์๋ thumbnailURLRequest
ํจ์์๊ฒ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋๊ฒจ์ค๋๋ค.
thumbnailURLRequest
ํจ์๋ ์ํ์ ์ผ๋ง๋ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ฐ๋ ๋๋ฅผ ์ ์ ํ๊ณ ์์
์ด ์๋ฃ๋๋ฉด ์ ์ด๊ถ์ ๋ค์ Caller์ธ fetchThumbnail
ํจ์์๊ฒ ๋๋ ค์ค๋๋ค.
์ด ๊ฒฝ์ฐ ์ฐ๋ ๋๋ ์ด ๋ ์์ ์ธ์ ๋ค๋ฅธ ์์ ๋ค์ ์ํํ ์ ์์ต๋๋ค.
asynchronousํ ๊ฒฝ์ฐ์๋ ์ด๋จ๊น์?
fetchThumbnail
ํจ์๊ฐ data(for: request)
ํจ์์๊ฒ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ๋ ๊ฒ๊น์ง๋ ๋์ผํฉ๋๋ค.
ํ์ง๋ง await
๋ก ๋ช
์๋ data(for: request)
ํจ์๋ async ํจ์์ด๊ธฐ ๋๋ฌธ์ ์ค๊ฐ์ suspend ๋ ์ ์์ต๋๋ค.
async
ํจ์๊ฐ suspend๋๋ฉด, ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ค๋ฆ์๋ ์์คํ
์๊ฒ ๋๊ฒจ์ง๋๋ค.
๊ทธ๋ฌ๋ฉด ์์คํ ์ ๋ค๋ฅธ ์์ ์ ํ ์ ์๊ฒ ๋๋ ๊ฒ์ด์ฃ .
์์คํ ์ ์์์ suspend ๋๊ฑฐ๋ ์ํ์ด ํ์ํ ๋ค๋ฅธ ์์ ๋ค์ ์ฐ์ ์์๋ค์ ํ๋จํด๊ฐ๋ฉฐ ์ฒ๋ฆฌํด๋๊ฐ๋๋ค.
์์คํ
์ด suspend ๋์๋ ํจ์์ ์ฒ๋ฆฌ๊ฐ ํ์ํด์ก๋ค๊ณ ํ๋จํ๋ ์๊ฐ, ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋ค์ async
ํจ์์๋ data(for: request)
ํจ์์๊ฒ ์ฌ๊ฐ(resume)๋๊ณ ์ดํ์ ์์
๋ค์ด ์ํ๋ ์ ์๊ฒ ๋ฉ๋๋ค.
์ ๋ค์ ๋์๊ฐ์ Suspend๊ฐ ์ด๋ฃจ์ด์ง๋ ๊ณผ์ ์ ์์ธํ ์ดํด๋ณผ๊ฒ์.
Synchronousํ ํจ์์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ์ ์คํ ์์ญ์ ํจ์๋ค์ด push
๋๋ฉฐ ์์ด๊ฒ ๋ฉ๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ํจ์์ ์คํ์ด ๋๋๋ฉด pop
๋์ด ์คํ์์ ์ ๊ฑฐ๋์ฃ .
์์ฃผ ๊ฐ๋จ๋ช ๋ฃํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด asynchronousํ ๊ฒฝ์ฐ์๋ ์ด๋จ๊น์?
async
ํจ์๋ผ๊ณ ๋ช
์๋์ด ์๋ ๊ฒฝ์ฐ, scope ์ ์ฒด๋ฅผ ํ ๋ฒ ๋๋ฉฐ suspension point (await
) ๋ง๋ค ์ด๋ค ๋ณ์๊ฐ ์ฌ๋ฌ ์ฐ๋ ๋์์ ์ฌ์ฉ๋๋์ง๋ฅผ ํ์
ํฉ๋๋ค.
์์์ ๊ฒฝ์ฐ, id
์ particle
์ ์ฐ๋ ๋ ์ฌ์ด๋ฅผ ์ค๊ฐ ํ์๊ฐ ์๋ local ๋ณ์์ด์ฃ ?
๋ฐ๋ผ์ ํด๋น ๋ณ์๋ค์ synchronous ํจ์์ ๊ฒฝ์ฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์คํ ์์ญ์ ์ ์ฅ๋ฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด await
์์ ์ฌ์ฉ๋ newArticles
๋ณ์*(ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์๊ธฐ ๋๋ฌธ์ ์์์ด์ง๋ง ํธ์์ ๋ณ์๋ผ๊ณ ํ๊ฒ ์ต๋๋ค.)*์ ๊ฒฝ์ฐ๋ ์ด๋จ๊น์?
suspend๋๋ ์ฝ๋๋ ์ ๊น ๋ฉ์ถฐ์๋ค๊ฐ ๋ค์ ์คํ๋์ผํ๊ธฐ ๋๋ฌธ์ ํ์ํ ๋ณ์๋ค์ ๋ฉ์ถ๊ธฐ ์ด์ ๊ณผ ์ดํ ๋ชจ๋ ์์ ์ ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค.
Swift๋ ์ด๋ฅผ ์ํด Heap ์์ญ์ ํ์ฉํฉ๋๋ค.
add
ํจ์๋ฅผ ํ ์์ญ์ ์ ์ฅํ๊ณ ๋๋ฉด ์คํ ์์ญ์๋ ํด๋น ํ๋ ์์ ๊ณ์ ๋ถ์ก๊ณ ์์ ํ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์คํ์ด ํ์ํ save
ํจ์๋ก ๋์ฒด๋ฉ๋๋ค.
์ด save
ํจ์ ์์ ๋ง์ฐฌ๊ฐ์ง๋ก await
์ฝ๋๊ฐ ๋ด๊ฒจ์๋ค๊ณ ๊ฐ์ ํด๋ณด๋ฉด, ํด๋น save
ํจ์ ๋ํ ํ ์์ญ์ผ๋ก ์ฎ๊ฒจ์ง ํ ์์คํ
์ ์ฐ๋ ๋ ์ ์ด๊ถ์ ๋๊ฒจ์ฃผ๊ฒ ๋ฉ๋๋ค.
์ฐ๋ ๋๋ ๋ค๋ฅธ ์์
๋ค(otherWork1
, otherWork2
)์ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ์์ญ์ ๋ณด๊ดํ๋ฉฐ ์ํํฉ๋๋ค.
๋ฐ๋ผ์ ํ ์์ญ์๋ async
ํจ์๋ค์ ์คํ๋ค์ด ๋ชจ์ฌ์๊ฒ ๋๋ ๊ฒ์ด์ฃ .
Continuation์ด๋ผ๋ ๊ฒ์ด ์ด๋ฐ ํ ์์ญ์ async
์คํ์ ๋ํํ๋ค๊ณ ํฉ๋๋ค.
Continuation์ด๋ ๋จ์ํ
await
์ดํ์ ์ํ๋๋ ์์ ๋ค์ ํํํ๋ ๋ง์ด๋ผ๊ณ ํฉ๋๋ค.
withCheckedThrowingContinuation(continuation:)
๊ณผ ๊ฐ์ ๋ฉ์๋์์ ์ฌ์ฉ๋๋ ์ฐธ๊ณ ํด์ฃผ์ธ์!
์์
์ด ์๋ ์ฐ๋ ๋๊ฐ ์๊ธฐ๊ณ ํ ์์ญ์ ์ ์ฅ๋ async
continuation์ด ๋ค์ ์์
์ผ๋ก ์ ํ๋๋ฉด, ํ ์์ญ์ ์๋ ์์
์คํ์ ํ๋์ฉ ๋ค์ ์คํ ์์ญ์ผ๋ก ๋ถ๋ฌ์ ์ฐจ๊ทผ์ฐจ๊ทผ ์์
์ ์ํํฉ๋๋ค.
์ด ๋, ์์ ์ด ์๋ ์ฐ๋ ๋๋ผ๋ ๊ฒ์
await
์ด์ ์ ์ํํ๋ ์ฐ๋ ๋์ผ์๋ ์๊ณ ์๋ ์๋ ์์ต๋๋ค. ๋ณด์ฅ๋์ง ์๋๋ค๋ ๊ฒ์ด์ฃ .
์ ๊ทธ๋์ ์ด async
/ await๋ฅผ
์ด์ฉํ Concurrency๋ ์ด๋ป๊ฒ ์ฌ์ฉํ๋ฉด ๋ ๊น์?
Task
์์ ์์๋ฅผ ์ฌ๋ฌ๋ฒ ์ํํ๋ ๋ ๋ค๋ฅธ ์์์ ๋๋ค.
์ด ์์๋ ์๋นํ ์ข์ ์์์ด๊ณ ์์ฃผ ์ ์์ ์ผ๋ก ์ ๋์ํ๋ ์์์ ๋๋ค.
ํ์ง๋ง ํ ๊ฐ์ง ๊ฐ์ ์ด ํ์ํ ๋ถ๋ถ์ด ์์ต๋๋ค.
for in
์ ํตํด์ ์ฌ๋ฌ๋ฒ์ URLSession์
await
ํ๋ ๊ฒ์ธ๋ฐ์.. ์ด๋ฐ ์์ ๊ตฌํ์ ํ ๋ฒ์ ํ๋์ ๋ฃจํ๋ง์ ์ํํ ์ ์์ต๋๋ค.
async
ํ๊ฒ๋ ๊ตฌํํ์์ง๋ง concurrentํ์ง๋ ๋ชปํ ๊ฒ์
๋๋ค.
๋ํ fetchThumbnails()
์ด๋ผ๋ ํจ์ ๋ํ ๊ฒฐ๊ตญ์๋ async
ํจ์์ด๊ธฐ ๋๋ฌธ์ ํ๋ก์ ํธ์ ์ด๋๊ฐ์์๋ async
์ปจํ
์คํธ๋ฅผ ์ ๊ณตํด์ค ๊ณณ์ด ํ์ํฉ๋๋ค.
์ด ๋ Task๊ฐ ๋ฑ์ฅํฉ๋๋ค.
Task๋ concurrentํ ์ฝ๋ ์ํ์ ์ํ ์๋ก์ด async ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
async
ํจ์๋ฅผ ๋จ์ํ call ํ๋ ๊ฒ์ Task๋ฅผ ์์ฑํ์ง ์์ต๋๋ค! (GCD ๋ฑ์ ์ฌ์ฉํ๋ฉด call ํ ์๋ ์์ต๋๋ค.)
ํ์ง๋ง ์ด๋ค Task๋ค์ด ์๋ ๋ณด๊ธฐ ์ด์ ์ Task Tree๋ผ๋ ๊ฐ๋ ์ ์์๋์ด์ผ ํฉ๋๋ค.
Task Tree
Task Tree๋ Task์ ์ทจ์(cancellation), ์ฐ์ ์์(priority), ์ง์ญ๋ณ์(task-local variables) ๋ฑ์ ์์ฑ๋ค์ ๊ฒฐ์ ํ๋ ์์ฃผ ์ค์ํ ๊ฐ๋ ์ ๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก๋ ์ด๋ค async
ํจ์๊ฐ ๋ค๋ฅธ async
ํจ์๋ฅผ ํธ์ถํ๋ฉด, ๋ ํจ์๋ฅผ ํธ์ถํ๋ ๋ฐ์๋ ๊ฐ์ Task๊ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ async-let
์์ ์ฌ์ฉ๋ ์์์ ๊ฒฝ์ฐ๋ฅผ ๋จผ์ ํ ๋ฒ ๊ฐ์ ธ์๋ดค์ต๋๋ค.
fetchOne()
ํจ์๊ฐ ๋ ๊ฐ์ง์ Task data
์ metadata
๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ์
๋๋ค.
fetchOneThumbnail()
ํจ์๋ ๋ ๊ฐ์ง Task๋ฅผ child๋ก ๊ฐ๊ณ ์๋ค๊ณ ํ์ต๋๋ค.
์ด์ฒ๋ผ ํ Task๊ฐ ๋ค๋ฅธ Task๋ฅผ ์คํํ๋ฉด ์คํ๋ Task๋ค์ ํ์ฌ ํจ์๊ฐ ์คํ๋๊ณ ์๋ Task์ Child Task๊ฐ ๋ฉ๋๋ค.
Task๋ ํจ์์ ์ข ์๋ ๊ฐ๋ ์ ์๋์ง๋ง ํจ์์ ์๋ช ์ฃผ๊ธฐ์ ์ํฅ์ ๋ฐ์ ์๋ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Parent Task๋ ์ข ์๋ ๋ชจ๋ Child Task๋ค์ด ์ข ๋ฃ๋๊ธฐ ์ ์๋ ์ข ๋ฃ๋ ์ ์์ต๋๋ค.
๋ง์ฝ metadata
Task๊ฐ ์๋ฌ๋ฅผ throw
ํ๋ฉด์ ์ข
๋ฃ๋์๋ค๋ ์ํฉ์ ๊ฐ์ ํด๋ด
์๋ค.
๋ Task๋ ๊ฐ์ guard
๋ฌธ ๋ด์ ์๊ธฐ ๋๋ฌธ์ ์ฆ์ ์๋ฌ๋ฅผ throw
ํ๊ณ ํจ์๋ฅผ ์ข
๋ฃํ ์ ์๊ฒ ์ฃ ?
ํ์ง๋ง Task์์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ์ ํํ ๋งํ๋ฉด โ์ฆ์โ ์ข ๋ฃํ์ง๋ ์์ต๋๋ค.
metadata
Task๊ฐ ์คํจํ๋๋ผ๋ data
Task๋ ์ฌ์ ํ ๋์์ค์ผ ๊ฒ์
๋๋ค.
๋ฐ๋ผ์ ํด๋น Task๊ฐ ์ทจ์๋์๋ค๋ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ฃผ๊ณ Task๊ฐ ์ข ๋ฃ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ชจ๋ Task๊ฐ ์ข ๋ฃ๋ ์์ ์ ํจ์๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
์ฌ๊ธฐ์ ์ทจ์๋์๋ค(cancelled) ๋ผ๋ ๊ฒ์ ํด๋น Task๋ฅผ ์ข ๋ฃ์ํค๋ ๊ฒ์ด ์๋๊ณ ๊ฒฐ๊ณผ๊ฐ ๋ ์ด์ ํ์์๋ค๋ ๊ฒ์ ์๋ ค์ค ๋ฟ์ ๋๋ค.
๋ง์ฝ ์ทจ์๋ Task๊ฐ Child Task๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด ๋ชจ๋ Child Task๋ค ๋ํ ์ทจ์๋ฉ๋๋ค.
์ด๋ฌํ Task Tree ๋์์ ARC์ ๊ฐ์ด ์ค์๋ก ๋ฒ์ด์ง๋ Task Leak๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํจ์ด๋ผ๊ณ ํฉ๋๋ค.
์ด๋ฐ Task Tree์ ํน์ฑ์ ์ ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ํํํ ์ ์์ต๋๋ค.
Task์ ์ทจ์๋ ํ๋ ฅ์ (cooperative) ์ผ๋ก ์ด๋ฃจ์ด์ง๋๋ค.
- Task๋ ์ทจ์๋๋๋ผ๋ ์ฆ์ ์ข ๋ฃ๋์ง ์์ต๋๋ค.
- Task์ ์ทจ์ ์ฌ๋ถ๋ ์ด๋์์๋ ๊ฐ๋ฅํฉ๋๋ค. (synchronousํ ์ฝ๋์์๋)
์ด๋ ๊ฐ๋ฐ์๊ฐ Task๊ฐ ์ทจ์๋์์ ๋์ ๋์์ ๊ตฌํํ ์ ์๊ฒ ํ๊ธฐ ์ํจ์ด๋ผ๊ณ ํ๋ค์.
์ด ๋ง์ Task๊ฐ ์ค๋ ๊ฑธ๋ฆฌ๋ ๋์์ผ์๋ก ์ทจ์์ ๋์ํ๋ ์ฝ๋๊ฐ ๊ผญ ํ์ํ๋ค๋ผ๋ ๋ป ๊ฐ์ต๋๋ค.
์ค๋ช ๋ง์ผ๋ก๋ ๋ฌด์จ ๋ง์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ผ๋ ์์๋ฅผ ๋ค์ ๊ฐ์ ธ์๋ณด์ฃ !
์์ ๊ฐ์ด concurrentํ ๋์์ด ์ํ๋๊ธฐ ์ ์ Task.checkCancellation()
๋ if Task.isCancelled { break }
์ ํตํด ๋ถํ์ํ ์ธ๋ค์ผ ์์ฑ์ ๋์์ ๋ฐฉ์งํ๊ณ ์๋ฌ๋ฅผ ๋ฐฉ์ถํ ์ ์์ต๋๋ค.
์ ์์์ ๊ฒฝ์ฐ Task๊ฐ ์ทจ์๋์๋๋ผ๋ thumbnails์๋ ์ทจ์๋๊ธฐ ์ด์ ์ ์ฑ๊ณตํ ๋ฐ์ดํฐ๋ค์ด ๋ด๊ฒจ์๊ณ , ๊ทธ ๋ฐ์ดํฐ๋ค์ด ๊ทธ๋๋ก ๋ฐํ๋ฉ๋๋ค. ๋น ๋ฐ์ดํฐ ๋ฑ์ ๊ฒฐ๊ณผ๋ UI์ ์๋ฌ๋ฅผ ๋ฐ์์ํฌ ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋์ ๋๊ณ ์์ ํด์ผํฉ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ Task๊ฐ ์ธ์ ์ทจ์๋๊ฑฐ๋ ์๋ฃ๋๋์ง๋ฅผ ์์์ต๋๋ค! ๐
๋๋์ด Swift๊ฐ ์ ๊ณตํ๋ ๋ค์ํ ํํ์ Task๋ฅผ ์์๋ณผ ๋๊ฐ ๋์๋ค์. ํ๋์ฉ ์ดํด๋ณด์ฃ !
Structured Tasks
- async-let Tasks
์ง๊ธ๊น์ง์ URLSession.data()
ํจ์๋ ์์ ๊ฐ์ด ์ฌ์ฉ๋์์ต๋๋ค.
ํ์ดํ์ ๋ฐฉํฅ๋๋ก ๋จ ํ๊ฐ์ง์ ํ๋ฆ(๋จ๋ฐฉํฅ)๋ง์ด ์กด์ฌํฉ๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ๋ URLSession
์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ํจ์์ด๊ธฐ ๋๋ฌธ์ ์ํ ์๊ฐ๋์ ๋ค๋ฅธ ์์
๋ค์ด ์ํ๋๊ธธ ์ํฉ๋๋ค.
async-let
์ ์ฌ์ฉํ๋ฉด ์์ฒ๋ผ ํ๋ฆ์ด ๋ ๊ฐ์ง๋ก ๋๋์ด์ง๋๋ค.
Child Task๊ฐ ์์ฑ๋๊ณ , URLSession.data()
ํจ์๋ฅผ asyncํ๊ฒ ์คํํจ๊ณผ ๋์์ result
์๋ ์์ ๊ฐ(placeholder) ์ ๋๊ฒจ์ค์ฑ๋ก await
ํค์๋๊ฐ ๋ฑ์ฅํ ๋๊น์ง ์ํํฉ๋๋ค.
await
์์ ๊ธฐ๋ค๋ฆฌ๋ ์์
์ async
ํจ์๊ฐ ๋์ด ๋๋ฉด result
๊ฐ์ ๋์ฒดํ์ฌ ์ฌ์ฉํฉ๋๋ค.
๊ทธ๋ ๋ค๋ฉด ์ ์ฝ๋๋ฅผ async-let
์ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ ๊น์?
try await
์ child task์๊ฒ ์์
์ ๋๊ฒจ์คฌ๊ธฐ ๋๋ฌธ์ ๋ ์ด์ ํด๋น ํจ์๋ฅผ ํธ์ถํ๋ ์ง์ ์์๋ ํ์๊ฐ ์์ต๋๋ค.
Parent task์์ ๊ฒฐ๊ณผ๋ก ๋์จ ๋ณ์๋ฅผ ์ฌ์ฉํ ๋ ํ์ํ์ฃ .
๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ์ค ์ ์์ต๋๋ค.
๊ฐ๊ฐ์ URLSession
์์ try await
์ ์ ๊ฑฐํ๋ ๋์ ๋งจ ์์ async
๋ฅผ ๋ถ์ฌ์ฃผ๊ณ ,
Parent task์ธ fetchOneThumbnail()
ํจ์์์ data
์ metadata
๊ฐ ํ์ํ ์๊ฐ์ try await
์ ์ฌ์ฉํ๊ณ ์์ต๋๋ค!
- Group Tasks
async-let
์ ์ํํด์ผํ๋ Task์ ๊ฐ์๊ฐ ์ ํด์ ธ์์ ๋ ์ ์ฉํฉ๋๋ค.
๋ค์ ํ๋ฒ ์ ์์์ ๊ฒฝ์ฐ๋ฅผ ๋ณด๋ฉด, ๋ช ๊ฐ์ ์ธ๋ค์ผ์ ์์ฑํ๋์ง ๊ฐ์ fetchOne
์ด๋ผ๋ Task๋ ๊ณ ์ ์ ์ผ๋ก ๋ ๊ฐ์ Child Task๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
ํ์ง๋ง id
์ ๊ฐ์์ ๋ฐ๋ผ์๋ ์ํํ fetchOne()
ํจ์๊ฐ ์คํ๋ Task์ ๊ฐ์๋ ๋ฌ๋ผ์ง๊ฒ ์ฃ ?
Task Group์ ์ด๋ฐ ๊ฒฝ์ฐ์ ์ ์ฉํฉ๋๋ค.
Task Group์ ๋์ ๊ฐ์์ Task์ ์ํ์ด ๋์์ ํ์ํ ๋ ์ฌ์ฉ๋๊ธฐ ์ํด ๊ณ ์๋์์ต๋๋ค.
withThrowingTaskGroup(of:)
๋ฅผ ํตํด์ Task Group์ ๋ง๋ค์ด์ค ์ ์์ต๋๋ค.
์ด ํจ์๋ Child Task๋ฅผ ์์ฑํ๋ group ์ด๋ผ๋ ์ธ์คํด์ค๋ฅผ ์ฌ์ฉํ๋ Context๋ฅผ ์ ๊ณตํฉ๋๋ค.
๋ํ for ๋ฃจํ์ ๊ฐ ๋ฃจํ๋ค์ group.async
๋ฅผ ํตํด ๋น๋๊ธฐ์ ์ผ๋ก ์ํ๋๊ธฐ ๋๋ฌธ์ ๋๋คํ ์๊ธฐ์ ์์ ์๊ด ์์ด ์ํ๋ ์ ์์ต๋๋ค.
group
์ธ์คํด์ค๊ฐ ๋ฃจํ๋ฅผ ์ ๋ถ ๋์๋๋ผ๋ Task Tree์ ํน์ฑ์ ์ํด ๋ชจ๋ Task๊ฐ ์ข
๋ฃ๋ ๋๊น์ง await๋๋ค๋ ๊ฒ๋ ์ ์ ์๊ฒ ์ฃ !
๊ทธ๋ฐ๋ฐ.. ๋ชจ๋ ๊ฒ ํํ๋ก์ ๋ณด์ด๋ ์ ์ฝ๋๋ ๋๋๊ฒ๋ ์ฌ๊ฐํ ์๋ฌ๋ฅผ ๊ฐ์ง๋๋ค.. ๐ฐ
์ฌ์ง์ด ๋น๋๋ ์๋๋ ์ปดํ์ผ๋ฌ ์๋ฌ๋ฅผ ๋ด๋ฟ์ฃ ..
๋ฐ๋ก Data Race Issue๊ฐ ๋ฐ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค..
Data Race Issue๋ ํ ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ Task์์ ํ๋์ ๋ฐ์ดํฐ์ ์ ๊ทผํ ๋ ๋ฐ์ํ๋ ์๋ฌ์ ๋๋ค. ํ๋์ ๋ณ์๋ ํ ๋ฒ์ ํ๋์ ์ฐ์ฐ๋ง ๊ฐ๋ฅํ์ง๋ง, ์ฌ๋ฌ Task์์ ๋์์ ๊ฐ์ ์์ ํ๋ ค๊ณ ํ๋ฉด ํฌ๋ฌ์ฌ๊ฐ ๋๊ฑฐ๋ ๋ฐ์ดํฐ๊ฐ ์์๋๊ฒ ๋ฉ๋๋ค..
์ด ๊ฒฝ์ฐ์๋ ํ๋์ thumbnails
๋์
๋๋ฆฌ์ ์ฌ๋ฌ Task๋ค์ด ๋์์ ๊ฐ์ ๋ฃ์ด์ฃผ๊ณ ์์ฃ ?
์ด๋ Concurrency ํ๋ก๊ทธ๋๋ฐ์ ํ ๋ ๊ฐ๋ฐ์๋ค์ด ํํ ํ๋ ์ค์ ์ค์ ํ๋์ ๋๋ค.
Data Race Issue์ ํด๊ฒฐ์ ๊ฐ๋ฐ์์๊ฒ ๋ฌ๋ ค์์์ต๋๋ค.
ํ์ง๋ง ์ ๋ฐ์ดํธ๋ Swift Concurrency๋ ์ด๋ฅผ ์ปดํ์ผ๋ฌ์์ ๋ฏธ๋ฆฌ ๋ฐ๊ฒฌํ์ฌ ์๋ฌ๋ฅผ ๋ฐ์์์ผ์ฃผ๋ ๊ฒ์ด์ฃ ! ๐ (์ด๋ ๊ฒ ๋ค์ผ๋๊น ๋ฉ์ง์ฃ ?)
๊ทธ๋์ ์๋ฌ๋ฅผ ์ก์์ฃผ๊ธด ํ๋๋ฐ ํด๊ฒฐ์ ์ด๋ป๊ฒ ํด์ผํ ๊น์?
Task๋ ์ฌ์ค @Sendable
ํด๋ก์ ๋ผ๋ ํด๋ก์ ์ ์ํด ๊ฐ์ธ์ ธ ์์ต๋๋ค.
@Sendable
ํด๋ก์ ์ ์บก์ฒ๋ ๋
ํนํ๊ฒ๋ mutable
๋ณ์์ ๊ฐ์ ์บก์ฒํ์ง ๋ชปํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์ด๋ค ๊ฐ๋ค์ ์บก์ฒํ ์ ์๋๊ฐ ํ๋ฉด?
๊ฐ ํ์
(Int
, String
, โฆ) ๋ณ์, actors, ๊ณ ์ ํ synchronization์ ๊ฐ์ง class ๋ฅผ ์บก์ฒํ๊ฑฐ๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋ค์ ์์๋ก ๋์๊ฐ์ ์๋ฌ๋ฅผ ๊ณ ์ณ๋ณผ๊ฒ์..
thumbnails
์ ์ง์ ์ ์ผ๋ก ๊ฐ์ ๋์
ํ๋ ๋์ , String
ํ์
๊ณผ UIImage
ํ์
์ ํํ์ ๋ฐํํ๋ ๋ฐฉ์์ผ๋ก ๋ณ๊ฒฝํฉ๋๋ค.
๊ทธ ํ์ for await
๋ฃจํ๋ฅผ ํตํด ์์ฐจ์ ์ผ๋ก ๊ฐ๋ค์ thumbnails
์ ๋์
ํด์ฃผ๊ณ ์์ต๋๋ค.
AsyncSequence
ํ๋กํ ์ฝ์ ์ฑํํ ๊ฐ์ ๋ค๋ฃจ๊ณ ์๋ค๋ฉด for await
๋ฃจํ๋ฅผ ์ฌ์ฉํด๋ณผ ๊ฒ์ ๊ถ์ฅํ๊ณ ์๋ค์.
์.. ์ฌ๊ธฐ๊น์ง ์์๋ณธ async-let
๊ณผ Grouped Tasks
๋ Structured Task๋ผ๋ ๊ฐ์์ hierarchy๊ฐ ์ ๋๋ Task๋ค์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ด์์ต๋๋ค.
ํ์ง๋ง ์ธ์ ๋ ์ ๋๋ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์๋ ๊ฑด ์๋๊ธฐ ๋๋ฌธ์ Swift๋ Unstructured Tasks๋ผ๋ API๋ฅผ ์ถ๊ฐ๋ก ์ ๊ณตํ๊ณ ์์ต๋๋ค.
Unstructured Tasks
Hierarchy๊ฐ ์ ๋๋์ง ์์ Task์๋ ์ด๋ค Task๋ค์ด ์์๊น์?
๋จผ์ , Parent Task๊ฐ ์กด์ฌํ์ง ์์ ์ ์์ต๋๋ค. asyncํ์ง ์์ ์ปจํ ์คํธ์์ asyncํ Task๋ฅผ ์์ํด์ผํ ๋๊ฐ ์ด๋ฐ ๊ฒฝ์ฐ์ฃ .
๋ Task๊ฐ ํ๋์ scope๋ฅผ ๋์ด ์ฌ๋ฌ scope์์ ์ด๋ฃจ์ด์ง๋๋ก ํ ํ์๊ฐ ์์ ๋๋ ์์๊ฒ๋๋ค.
๋ณดํต delegate
ํจํด์ ์ฌ์ฉํ ๋ ํํ ์ผ์ด๋๋ ์ผ์ด๋ผ๊ณ ํ๋ค์.
์ ์์๋ฅผ ๋ด ์๋ค..
delegate
ํจ์์ธ collectionView(willDisplay:, forItemAt)
ํจ์๋ UI ๋ ์ด์ด์ ํจ์์ด๊ธฐ ๋๋ฌธ์ asyncํ์ง ์์ต๋๋ค.
ํ์ง๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ fetchThumbnails()
ํจ์๋ async ํจ์์ด์ฃ .
์ด๋ด ๋๊ฐ ๋ฐ๋ก Unstructured Task๋ฅผ ์ฌ์ฉํ ๋์ ๋๋ค.
๊ฐ๋จํ๊ฒ async ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ณณ์ Task
๋ก ๊ฐ์ธ์ค๋๋ค.
๋ฐํ์๋์ ์ด Task๋ฅผ ์์ฑํ๋ ๋ถ๋ถ์ ๋ง์ฃผ์น๊ฒ ๋๋ฉด, ์ํํ๋ scope์ ๊ฐ์ actor์์ ์คํ๋๋๋ก ์์ฝ์ ํด๋ก๋๋ค.
์์์ ๊ฒฝ์ฐ์๋ MainActor
์์ ์คํ์ด ๋ ๊ฒ๋๋ค.
์ด๋ ๊ฒ ์ฌ์ฉํ๊ธฐ ๊ฐํธํ๋ค๋ฉด ๋จ์ ๋ ๋น์ฐํ ์๊ฒ ์ฃ ?
Task์ ์๋ช
์ฃผ๊ธฐ๊ฐ scope์ ์ข
์๋์ง ์๊ณ synchronousํ ์ฝ๋ ์ค๊ฐ์์๋ ํธ์ถ์ด ๋ ์ ์๊ธฐ ๋๋ฌธ์ Structured Task์์ ์๋์ผ๋ก ์ํ๋ ์ ์์๋ ์ทจ์์ await
๋ฅผ ๊ฐ๋ฐ์๊ฐ ์ง์ ํด์ค์ผ ํฉ๋๋ค.
์ด ๊ฒฝ์ฐ, Task๋ฅผ ์์ฑํ ๋ค์ thumbnailTasks
๋ผ๋ ๋์
๋๋ฆฌ์ ์ ์ฅํ์์ต๋๋ค.
๊ทธ๋ฌ๋ฉด ๋์ค์๋ ์ธ์ ๋ ์ง ์ ๊ทผํด์ ์์ ์ ์ทจ์ํ ์ ์๊ฒ ์ฃ ?
defer
๋ฌธ์ ์ฌ์ฉํด Task๊ฐ ๋๋ ์์ ์ ์ ์ฅ๋ Task๋ฅผ ํด์ ํจ์ผ๋ก์จ ์ด๋ฏธ ์๋ฃ๋ Task๋ฅผ ์ทจ์ํ๋ ์ผ๋ ๋ฐฉ์งํด๋ ๊ฒ์ ๋ณผ ์ ์๋ค์.
๐ ์ด๋ผ ๊ทธ๋ฐ๋ฐ.. ๊ฐ์ ๋ฐ์ดํฐ์ ์ฌ๋ฌ Task๊ฐ ๋์์ ์ ๊ทผํ๋ฉด ์๋๋ค๊ณ ํ์ง ์์๋์?
๋ง์ต๋๋ค.. ํ์ง๋ง ์ด ๊ฒฝ์ฐ์๋ @MainActor
, ์ฆ ๋ฉ์ธ์ฐ๋ ๋์์ ์ด๋ฃจ์ด์ง๊ธฐ ๋๋ฌธ์ ์ ๋๋ก ๋์์ ์ผ์ด๋ ์ผ์ด ์์ต๋๋ค.
์ ์ด ํ๋ฉด์์ ๋ฒ์ด๋๋ฉด ์์ ์ ์ทจ์ํด๋ ๋๊ฒ ์ฃ .
๋ค์๊ณผ ๊ฐ์ด task.cancel()
๋ก Task๋ฅผ ์ทจ์ํด์ค ์ ์์ต๋๋ค.
Detached Tasks
์ด๋ผ ๋ญ๊ฐ ํ๋ ๋ ์์ฃ โฆ?
Unstructured Tasks๋ ์ด๋ค ์ค์ฝํ์์๋ ์ํ๋ ์ ์๋ Task์์ต๋๋ค. ํ์ง๋ง ์ด๋ค ์ปจํ ์คํธ์์ ์์๋์๋์ง๋ ์ค์ํ ์์์์ต๋๋ค.
ํด๋น scope์ ๋ณ์๋ ์ฌ์ฉํด์ผ ํ๊ณ ,
Detached Tasks๋ ๊ทธ ์ด๋ค ๊ฒ๋ ์๊ด์ด ์์ ๋ ์ฌ์ฉํ๋ Task์ ๋๋ค.
Detached Tasks๋ ์ปจํ ์คํธ๋ก๋ถํฐ ๋ ๋ฆฝ์ ์ ๋๋ค.
์์๋ scope์์ ์๋ฌด ๊ฐ๋ ๊ฐ์ ธ์ค์ง ์์ต๋๋ค.
์ฌ์ง์ด ๊ฐ์ actor์์ ์คํ๋๋๋ก ๋์ด์์ง๋ ์์์ ๊ฐ์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ ์์ต๋๋ค.
์ ์์๋ ์ธ๋ค์ผ์ ์์ฑํ ํ์ ๋ก์ปฌ ๋์คํฌ์ ์บ์ฑ์ ํ๋ ์์ ์ Detached Task์์ ์์ ํ๋๋ก ํ๋ ์ฝ๋์ ๋๋ค.
์บ์ฑ์ @MainActor
์์ ์ฒ๋ฆฌ๋ ํ์๊ฐ ์ ํ ์์ฃ .
๋์ ์ฐ์ ์์๋ฅผ ๊ฐ์ง ํ์๋ ์์ต๋๋ค.
Task.detached(priority:)
๋ฅผ ํตํด์ ๊ฐ๋จํ๊ฒ ์ปจํ
์คํธ์์ ๋
๋ฆฝ๋ Detached Task๋ฅผ ๋ง๋ค์ด์ค ์ ์์ต๋๋ค.
Detached Task์ Task Group์ ์ฌ์ฉํด์ hierarchy๋ฅผ ๋ง๋ค์ด์ค ์๋ ์์ต๋๋ค.
์ฌ๋ฌ๊ฐ์ง ๋ฐฑ๊ทธ๋ผ์ด๋ ์์ ์ด ํ์ํ์ง๋ง ์ฐ๊ฒฐ๋ ์์ ์ด ํ์ํ ๋ ์์ฃผ ์ ์ฉํ๊ฒ ์ฃ !
์ ๋ฆฌ
Actor
๋๋ ์ค ์์์ฃ ..?
ํ์ง๋ง ์์ง ๋ง์ด ๋จ์์ต๋๋ค. ๐คฏ
์์์ Actor
๋ผ๋ ํค์๋๊ฐ ์ฌ์ฉ๋์์์ฃ ..?
์ด๊ฒ ๋ญ์ง๋ ์์๋ด์ผ์ฃ ..
Actor๊ฐ ๋ญ์ง ์์๋ณด๋ ค๋ฉด ๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฏธ ํ ๋ฒ ์ดํด๋ณธ Data Race Issue์ ๊ด๋ จ๋์ด ์๋ค๋ ๊ฒ์ ์๊ณ ์์ํด์ผํฉ๋๋ค.
Data Race๋ ์ฌ๋ฌ ๊ฐ์ Task์์ ๋์์ ํ๋์ mutable ๊ฐ์ ์ ๊ทผํ๋ ค๊ณ ํ๋ฉด ๋ฐ์ํ๋ ๋ฌธ์ ์์ต๋๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ๊น์?
๋ณํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ฌ๋ฌ Task์ ๊ฑธ์ณ ์ฌ์ฉ๋์ง ์๋๋ก ํ๋ฉด ํด๊ฒฐ๋๊ฒ ์ฃ ?
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ํ๋ฉด ๋๊ฒ ๋ค์!
let
์ผ๋ก ๊ฐ์ด ๊ณ ์ ๋ ๊ฐ์ ๊ฐ Task์์ mutable
ํ ๊ฐ์ผ๋ก ๋ณต์ฌํ ๋ค ์์
์ ํด์ฃผ๋ฉด ๋๊ฒ ์ฃ .
์๋จ ์๋์ต๋๋ค. ๐ โโ๏ธ
์๋ฌ๋ ๋ฐ์ํ์ง ์์ง๋ง Task๋ง๋ค ๋ณต์ฌ๋ ๊ฐ์ ์๋ก์ ๊ฐ์ ์ํฅ์ ์ฃผ์ง ๋ชปํ๊ฑฐ๋ ์.
๊ทธ๋ฌ๋ฉด ์ด๋ ๊ฒ ์ ๋ฆฌํ ์ ์์ต๋๋ค: ๊ฐ Task๋ค์ด ๊ณต์ ํ ์ ์๋ mutable
Task๊ฐ ํ์ํ๋ค!
Swift๋ ์ด๋ฏธ ๊ทธ๋ฐ feature๋ค์ ๊ฐ๊ณ ์์ต๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ ์ค๋๋ ๋ฌธ์ ๊ฑฐ๋ ์..
mutable
state๋ฅผ ๋๊ธฐํํ๋ ์์
์ ๋ก์ฐ๋ ๋ฒจ ๋จ๊ณ์์ ์ฌ์ฉํ ์ ์๋ Atomics, Locks, ๋ ๋์ ๋ ๋ฒจ์์ ์ฌ์ฉํ ์ ์๋ Serial DIspatch Queues๊ฐ ์์ต๋๋ค.
์ด๋ค์ ๋ชจ๋ ๊ฐ์ ์ญํ ์ ํ๊ณ ๊ฐ์ ๋ฌธ์ ๋ฅผ ๊ฐ๊ณ ์์ต๋๋ค.
Shared mutable state์ Data Race ์์ด ์ ๊ทผํ ์ ์์ง๋ง, ์ฌ์ฉ๋ฒ์ด ์กฐ๊ธ์ด๋ผ๋ ์ด๊ธ๋๋ฉด ๋ฐ๋ก ์ฑ์ด ํฌ๋ฌ์ฌ๋๋ค๋ ๊ฒ์ด์ฃ .
Actors๋ ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ shared mutable state์ ๋๊ธฐํ๋ฅผ ์ข ๋ ์ฝ๊ฒ ์ด๋ฃฐ ์ ์๋๋ก ๋ฑ์ฅํ์ต๋๋ค.
Actors๋ state๋ฅผ ๋ค๋ฅธ ๋ชจ๋ ํ๋ก๊ทธ๋จ์์ ๋ถ๋ฆฌํ์ฌ ๊ด๋ฆฌํฉ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น state์ ์ ๊ทผํ๋ ค๋ฉด ๋ฌด์กฐ๊ฑด actor ๋ด๋ถ์ ๋ค์ด๊ฐ์ผ๋ง ํ์ฃ .
Actor๋ ์กฐ๊ธ ํน์ดํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ก์ด ํ์ ์ด๊ฑฐ๋ ์.
๋ง์น struct
, enum
, class์
๊ฐ์ด ํ๋กํผํฐ, ๋ฉ์๋, ์์ฑ์ ๋ฑ์ ๊ฐ์ง๋๋ค.
protocol
๊ณผ extension
๋ํ ์ฌ์ฉํ ์ ์์ต๋๋ค.
๋, actor๋ shared mutable state์ ์ ๊ทผํ๊ธฐ ์ํด ๋ง๋ค์ด์ง ๋งํผ class
์ ๊ฐ์ ์ฐธ์กฐ ํ์
์
๋๋ค.
์ฌ์ฉ๋ฒ์ class
์ ๋์ผํฉ๋๋ค.
ํ ๊ฐ์ง ์ฃผ์ํ ์ ์ด ์๋ค๋ฉด class
์๋ ๋ค๋ฅด๊ฒ ์์์ ์ง์ํ์ง๋ ์์ต๋๋ค!
๊ทธ๋ฆฌ๊ณ ๊ฐ์ฅ ์ค์ํ ์ ์ actor์์ ์ ์๋ ๊ฐ๋ค์ ๋์์ ์ ๊ทผ๋์ง ์๋๋ก ๋ณด์ฅ๋์ด ์๋ค~๋ผ๋ ์ ์ ๋๋ค.
์์ ์์์ ์ ์ฉํด๋ณด๋ฉด ์ด๋ ๊ฒ ๋ฉ๋๋ค.
๊ฐ์ ๊ฐ์ ์ ๊ทผํ์ง๋ง, ์ ๋ ๋์์ ์ ๊ทผํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์์๋๋ก 2, 1์ด๋ 1, 2๊ฐ ์ถ๋ ฅ๋ ๊ฒ๋๋ค.
ํ์ง๋ง suspend๋ ์์ ์ด actor ์์์ ์์ ํ ์ฐจ๋ก๋ฅผ ๊ธฐ๋ค๋ฆด ๊ฒ์ด๋ผ๋ ๋ณด์ฅ์ ๋๋ ๊ฑธ๊น์?
์ฐ๋ฆฌ๋ ์ด๋ฏธ ๊ทธ๋ฐ ์ญํ ์ ํ๋ ํค์๋๋ฅผ ์๊ณ ์์ต๋๋ค.
actor์ ์ธ๋ถ์์๋ await
ํค์๋๋ฅผ ํตํด ํด๋น ์์
์ด suspendableํ๋ค๋ ๊ฒ์ ๋ช
์ํด์ค ์ ์์ต๋๋ค.
ํ์ง๋ง actor์ ๋ด๋ถ์์๋ ์ด์ ๊ฐ์ ํค์๋๋ ํ์๊ฐ ์์ฃ .
๋ชจ๋ ์ฝ๋๊ฐ synchronousํ๊ฒ ์คํ๋๊ธฐ ๋๋ฌธ์ ๋์์ฑ ํ๋ก๊ทธ๋๋ฐ์ ๋ฌธ์ ๋ฅผ ์ ๊ฒฝ์ฐ์ง ์๊ณ ์์ ํ ์ ์์ต๋๋ค.
Actor Reentrancy
์ ์ฝ๋๋ ์ด๋ฏธ์ง๋ฅผ ์บ์ฑํ๋ ์์
์ ์ํํ๋ actor
์
๋๋ค.
๋ฌธ์ ๋ await
์์ ๋ฐ์ํฉ๋๋ค.
์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๋ ๊ณผ์ ์ ์๊ฐ์ด ์ค๋ ์์๋๋ ์์
์ด๋ await
์ ์ฌ์ฉํ๋ ๊ฒ์ ์ฌ๋ฐ๋ฅธ ์ ๊ทผ์
๋๋ค.
ํ์ง๋ง ๋์์ ๋ ๊ตฐ๋ฐ์์ ๊ฐ์ url์ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ค๊ธธ ์ํ๊ณ , ํ๋์ ์์ ์ด ์ํ๋๋ ๋์ ์๋ฒ์ ์ด๋ฏธ์ง๊ฐ ๊ต์ฒด๋๋ ์ํฉ์ด ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น์?
๋ ์์ ์ ๋์์ ์์ฒญ๋์์๋ ๋ถ๊ตฌํ๊ณ ๋ค๋ฅธ ์ด๋ฏธ์ง๋ฅผ ๋ฐ์์ค๊ฒ ๋ ๊ฒ๋๋ค.
์ด ๊ฒฝ์ฐ์๋, ์ด๋ฏธ url์ ํด๋นํ๋ ์ด๋ฏธ์ง๊ฐ ์๋ค๋ฉด ๊ทธ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ ์ฌ์ฉํ๊ณ , ์๋ค๋ฉด ์๋ก์ด ์ด๋ฏธ์ง๋ฅผ ๋ฃ๋ ๊ฒ์ผ๋ก ํด๊ฒฐํ์์ต๋๋ค.
์ด์ ๊ฐ์ด actor ๋ด๋ถ์์ await
์ ์ฌ์ฉํ๋ ๊ฒ์ ์จ๊ฒจ์ง ๋ฒ๊ทธ๋ฅผ ์ ๋ฐํ ์ ์๊ธฐ ๋๋ฌธ์ ์ฃผ์๊ฐ ํ์ํฉ๋๋ค.
์ด๋ฐ ๊ณผ์ ์ actor์ ์ฌ์ง์ ํ์ฌ ์์ ์ ์ํํ๋ค๊ณ ํด์ Actor Reentrancy๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
๋ค์ ์ธ ๊ฐ์ง๋ฅผ ํญ์ ์๊ฐํด๊ฐ๋ฉฐ ์ฝ๋๋ฅผ ์ง๋ด ์๋ค.
- ๋๋๋ก synchronousํ๊ฒ ๋ฐ์ดํฐ๋ฅผ mutate ์ํจ๋ค.
await
์์ suspend๋ ๋์ state๊ฐ ๋ฐ๋ ์ ์์์ ์๊ฐํ๋ค.await
ํ์ ์กฐ๊ฑด๋ฌธ ๋ฑ์ ํตํด state๊ฐ ์์๋ฒ์ ์์ธ์ง ์ฒดํฌํ๋ค.
Actor Isolation
Actor๋ ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๋ค๊ณผ ๋ ๋ฆฝ์ ์ผ๋ก ์๋ ์กด์ฌ๋ผ๊ณ ํ์์ฃ ?
๋ฐ๋ผ์ ์ธ๋ถ์์ actor์ ์ ๊ทผํ ๋๋ ์ด๋ฐ ๋ ๋ฆฝ์ฑ์ ํด์น๋ฉด์ ์ ๊ทผํ ์๋ ์์ต๋๋ค.
์ฌ๊ธฐ์๋ถํฐ ์กฐ๊ธ ์๋ํด์ง๋๋ค.. ์ฃผ์ํ์ธ์โฆ ๐ซ
- Protocol
์ด ๊ฒฝ์ฐ Equatable
๋ฉ์๋๋ static
์ด๊ณ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ๋ ๋ actor ํ์
๊ฐ์ ์ธ๋ถ์ ์์ผ๋๊น ๊ฐ๋ฅํ ๋ฌธ๋ฒ์
๋๋ค.
๋ฐ๋ฉด ์ด ๊ฒฝ์ฐ์๋ ํ์ฉ๋์ง ์์ต๋๋ค.
hash(into:)
ํจ์๋ actor ๋ด๋ถ์ ๋ค์ด๊ฐ๊ณ , asyncํ์ง๋ ์๊ธฐ ๋๋ฌธ์
๋๋ค.
ํ์ง๋ง ์ด์ํ ์ ์ด ์์ต๋๋ค. ๐
actor ๋ด๋ถ์ ๋ค์ด๊ฐ๋ ๊ฒ์ ๋ง์ง๋ง, ์ค์ ๋ก actor๊ฐ ๊ฐ๊ณ ์๋ ๊ฐ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ ์๋๊ฑฐ๋ ์..
๊ทธ๋ฐ ๊ฒฝ์ฐ์๋ nonisolated
ํค์๋๋ฅผ ๋ถ์ฌ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํ์ง๋ง ๋์ด ์๋๋๋ค..
์ด ๊ฒฝ์ฐ์๋ ์ฌ์ฉํ๋ actor์ ํ๋กํผํฐ idNumber
๊ฐ immutableํ ๊ฐ์ด๊ฑฐ๋ ์.
ํ์ง๋ง mutableํ ๊ฐ์ ์ฌ์ฉํ๋ ค๊ณ ํ๋ฉดโฆ?
์ด๊น์์ด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ธ๋ถ์์ mutableํ ๊ฐ์ ์ ๊ทผํ๋ ๊ฒ์ Data Race๋ฅผ ์ ๋ฐํ ์ ์๊ฑฐ๋ ์.
- Closure
์ด๋ฒ์๋ ํด๋ก์ ์์์ ์คํ๋๋ ํจ์์ ๊ฒฝ์ฐ๋ฅผ ์ดํด๋ด ์๋ค.
์ ์์๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋
๋ฆฝ๋ ๊ณต๊ฐ์ ์๋ read()
ํจ์ ์์ ์๋ (๋ง์ฐฌ๊ฐ์ง๋ก ๋
๋ฆฝ๋ ๊ณต๊ฐ์ ์๋) readSome()
ํจ์๊ฐ synchronousํ๊ธฐ ๋๋ฌธ์ ์์ฐจ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ด์ฃ !
๊ทธ๋ ๋ค๋ฉด ์ด ๊ฒฝ์ฐ๋ ์ด๋จ๊น์..
Detached Task์ read()
ํจ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ์ด ๊ฒฝ์ฐ์๋ ํด๋ก์ ์์ ์์
๋ค์ด ๋
๋ฆฝ๋ ๊ณต๊ฐ์ ์์ง ์๊ณ ๋ฐ์ผ๋ก ๋๊ฐ๊ฒ ๋ฉ๋๋ค.
๋๋ฌธ์ ํด๋น ํด๋ก์ ๋ actor์ ์์ง ์๊ณ , await
ํค์๋๋ฅผ ๋ถ์ฌ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋์ด์ผ ํฉ๋๋ค.
์ ์ด ๊ฒฝ์ฐ๋ฅผ ๋ด ์๋ค..
Book
์ด๋ผ๋ ์ธ์คํด์ค๋ class
ํ์
์
๋๋ค. ์ฐธ์กฐ ํ์
์ด๋๊น actor ์์ ์์ง ๋ชปํ๊ณ ์ธ๋ถ์ ์์นํด์์ฃ .
actor ์์ ์ฐธ์กฐ ํ์ ์ ๊ฐ์ด ์๋ ๊ฒ ์์ฒด๋ ์๋ฌด ๋ฌธ์ ๊ฐ ์์ต๋๋ค.
๋ฌธ์ ๋ ํด๋น ๊ฐ์ ์ ๊ทผ์ ํ ๋ ๋ฐ์ํ๊ฒ ์ฃ ? (Data Race)
์ฌ๊ธฐ์ ์ต์ํ ํค์๋๊ฐ ๋ฑ์ฅํฉ๋๋ค.
Sendable
Sendable
ํ์
์ ๋ค๋ฅธ ์ฌ๋ฌ actor๋ค ์ฌ์ด์์ ํจ๊ป ์ฌ์ฉ๋ ์ ์๋ ํ์
์
๋๋ค.
์ด๋ค ๊ฐ์ ๊ฐ์์ actor๋ก ๋ณต์ฌํ๊ณ , ๋ณต์ฌ๋ ๊ฐ์ ๋
๋ฆฝ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ฉด ํด๋น ๊ฐ์ Sendable
ํ๋ค๊ณ ํ ์ ์์ต๋๋ค.
๊ฐ ํ์
๊ณผ Actor ํ์
์ ๊ธฐ๋ณธ์ ์ผ๋ก Sendable
ํฉ๋๋ค.
ํ์ง๋ง ํด๋์ค(์ฐธ์กฐ ํ์ ) ์ ๊ฒฝ์ฐ์๋ ๊ณ ๋ คํด์ผํ ์ฌํญ์ด ์์ฃ ..
- ํด๋์ค์ ์๋ ๋ชจ๋ ๊ฐ๋ค์ด immutable(
let
) ํ ๊ฒฝ์ฐ - ํด๋์ค ๋ด๋ถ์ ์ผ๋ก ๋๊ธฐํ(
NSLock
, ...)๋ฅผ ๊ตฌํํ ๊ฒฝ์ฐ
ํ์ง๋ง ๋๋ถ๋ถ์ ํด๋์ค๋ ๊ทธ๋ ์ง ์๊ธฐ ๋๋ฌธ์ Sendable์ด ์๋๋ผ๊ณ ํ ์ ์์ต๋๋ค.
ํจ์๋ ๊ธฐ๋ณธ์ ์ผ๋ก๋ Sendableํ์ง ์์ง๋ง @Sendable
ํจ์์ ๊ฐ์ ์๋ก์ด ํ์
์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด Sendableํฉ๋๋ค.
Sendable์.. ์์ํ์ จ๊ฒ ์ง๋ง ์ฌ์ค ํ๋กํ ์ฝ์ ๋๋ค.
Swift์์ concurrentํ ์์ ์ ํ๊ธฐ ์ํด์๋ Sendable ํ๋กํ ์ฝ์ ์ค์ํ ๊ฐ๋ค์ ์ฌ์ฉํด์ผํ๋ ๊ฒ์ด์ฃ ..!
์.. ๋ค์ ํด๋ก์ ๋ก ๋์๊ฐ๋ด ์๋ค.
ํด๋ก์ ๊ฐ Sendable
ํ๋ ค๋ฉด ์ด๋ค ๊ฒฝ์ฐ์ฌ์ผ ํ ๊น์?
๊ฐ๋จํฉ๋๋ค. ํด๋ก์ ๊ฐ ์บก์ฒํ๋ ๋ชจ๋ ๊ฐ๋ค์ด Sendableํด์ผํ์ฃ .
๋ ์บก์ฒํ ๊ฐ๋ค์ด mutable(var
) ํ๋ฉด ์๋ฉ๋๋ค.
๊ทธ๋ฌ๋ฉด Data Race๊ฐ ๋ฐ์ํ ํ ๋๊น์..
๋ง์ง๋ง์ผ๋ก ํด๋ก์ ๊ฐ synchronousํ ๊ฒฝ์ฐ์ actor์์ ๋ ๋ฆฝ๋ ํํ์ด๋ฉด ์๋ฉ๋๋ค.
์ธ๋ถ์์ ์ ๊ทผ์ด ๊ฐ๋ฅํด์ง๋๊น์!
Main Actor
๋ง์ง๋ง์ผ๋ก ์ดํด๋ณผ ๊ฒ ์์ต๋๋ค.
Main Actor๋ผ๋ ํน์ํ actor์ธ๋ฐ์, ์ด๋ฏธ ์ ์ ํ ๋ฒ ์ธ๊ธ๋ ์ ์ด ์์์ฃ ?
๋ฐฑ๊ทธ๋ผ์ด๋์์ ์์ ์ ํ๋ค๊ฐ ๋ค์ ๋ฉ์ธ์ฐ๋ ๋๋ก ๋์ด์ UI๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ๋ ์ํฉ..
์์ฃผ ์ต์ํ์ฃ ?
DispatchQueue.main.async {
updateButton()
}
๋ณดํต ์์ ๊ฐ์ด DispatchQueue.main
์ ์ฌ์ฉํด์ค๊ณค ํ์ต๋๋ค.
@MainActor
๋ ํด๋น ์์
์ด ๋ฉ์ธ์ฐ๋ ๋์์ ์ด๋ฃจ์ด์ ธ์ผ ํ๋ค๋ ๊ฒ์ ๋ช
์ํ๋ ํค์๋์
๋๋ค.
DispatchQueue.main
๋์ ์ฌ์ฉํ์ฌ ๋ช
์์ ์ผ๋ก ๋ฉ์ธ์ฐ๋ ๋์์ ๋์ํด์ผํ๋ค๋ ๊ฒ์ ์ปดํ์ผ๋ฌ์๊ฒ ์๋ ค์ค์๋ค..!
References
WWDC21 - Swift concurrency: Behind the Scenes
WWDC21 - Explore structured concurrency in Swift