π Continuation ?
- async λ©μλ νΈμΆ μ, μ€λ λμ μ μ΄κΆμ ν¬κΈ°νλ suspended νμμ΄ λ°μν¨
- μ μ΄κΆμ΄ λ€μ λμμμ λ, μ΄λμλΆν° μ€νν μ§μ λν μ λ³΄κ° μμ΄μΌν¨
- μ΄ λ, Suspension Pointsλ₯Ό ν΅ν΄ νμ
νκ³ μ€μ§λ μμ λΆν° μ¬μ€νν¨
- μ΄μ²λΌ μμ μ΄ μΌμμ μ§λκ³ κ·Έ μμ λΆν° μ¬μ€νλλ κ²μ Continuation μ΄λΌκ³ λͺ μΉ
- μ΄ λ, Suspension Pointsλ₯Ό ν΅ν΄ νμ
νκ³ μ€μ§λ μμ λΆν° μ¬μ€νν¨
- μ μ΄κΆμ΄ λ€μ λμμμ λ, μ΄λμλΆν° μ€νν μ§μ λν μ λ³΄κ° μμ΄μΌν¨
Suspension Point
- Swift Concurrency μμ
μ΄ μΌμμ μ§λμ΄ κ²°κ³Όλ₯Ό κΈ°λ€λ¦¬λ μ§μ
- = λΉλκΈ° μμ μλ£ ν λ€μ μ€νλλ μμ
- β Heapμ μ μ₯λλ μ΄μ
- λΉλκΈ° μμ
μ μν μΆμ
- νμ λμ μΌλ‘ λ©λͺ¨λ¦¬λ₯Ό ν λΉν΄ 볡μ‘ν μνλ₯Ό μ μ§ν μ μμ
- λ©λͺ¨λ¦¬ κ΄λ¦¬
- λΉλκΈ° ν¨μκ° μΌμμ μ§λμμ λμλ λ©λͺ¨λ¦¬ μμ κ³μ ν΄λΉ μ§μ μ΄ λ¨μμμ΄μΌν¨
- μ¦, ν΄λΉ κ°μ²΄λ ν¨μμ νΈμΆμ μλͺ
μ΄ μλ λΉλκΈ° μμ
μ μλͺ
μ λ°λΌκ°
- κ³ λ‘ λΉλκΈ° μμ μ΄ λλ λκΉμ§ λ¨μμμ΄μΌνλ―λ‘ νμ μ μ₯λ¨
- μ¦, ν΄λΉ κ°μ²΄λ ν¨μμ νΈμΆμ μλͺ
μ΄ μλ λΉλκΈ° μμ
μ μλͺ
μ λ°λΌκ°
- λ§μ½ μ€νμ μ μ₯νλ κ²½μ°, μ΄ν μλ‘μ΄ awaitμ μν΄ ν΄λΉ λ³μκ° λ³κ²½λκ±°λ λ³μ μμ²΄κ° μ¬λΌμ§ μ μμ
- λΉλκΈ° ν¨μκ° μΌμμ μ§λμμ λμλ λ©λͺ¨λ¦¬ μμ κ³μ ν΄λΉ μ§μ μ΄ λ¨μμμ΄μΌν¨
- λ©ν°μ€λ λ νκ²½μμμ λμμ± κ΄λ¦¬
- λΉλκΈ° μμ
μ μ¬λ¬ μ€λ λμμ λμμ μ€νλ μ μμ
- μνλ₯Ό μμ νκ² κ΄λ¦¬νκΈ° μν΄ μν κ°μ²΄κ° νμ μμ΄μΌν¨
- κ²°κ³Όμ μΌλ‘ κ° λΉλκΈ° μμ λ€μ΄ λ 립μ μΌλ‘ κ°μμ μνλ₯Ό μ μ₯νκ³ κ΄λ¦¬ν μ μμ
- μνλ₯Ό μμ νκ² κ΄λ¦¬νκΈ° μν΄ μν κ°μ²΄κ° νμ μμ΄μΌν¨
- λΉλκΈ° μμ
μ μ¬λ¬ μ€λ λμμ λμμ μ€νλ μ μμ
- λΉλκΈ° μμ
μ μν μΆμ
GCDμμ μ°¨μ΄
- GCD
- GCDμ κ²½μ°, μ€λ λκ° λΈλ½λλ©΄ μμ
μ λ€λ₯Έ μ€λ λλ‘ λ³΄λΌ λ Full Thread Context Switching λ°©μμ μ¬μ©ν¨
- μ΄λ λ§μ λΉμ©μ΄ λ°μν¨
- - λ°μ λΉμ©
- μ€λ λ μν μ μ₯κ³Ό 볡μ
- νμ¬ μ€ν μ€μΈ μ€λ λμ λ μ§μ€ν° κ°, PC λ±μ μ μ₯νκ³ λ€λ₯Έ μ€λ λλ‘ μ νμ 볡μ
- μ€μΌμ€λ§
- μ μ ν μ€λ λλ₯Ό μ ννκ³ μ€μΌμ€λ§νλ κ³Όμ μ κ±°μΉ¨
- μ΄λ₯Ό ν΅ν΄ μκ°κ³Ό 리μμ€κ° μλͺ¨λ¨
- μ μ ν μ€λ λλ₯Ό μ ννκ³ μ€μΌμ€λ§νλ κ³Όμ μ κ±°μΉ¨
- Cache miss
- μλ‘μ΄ μ€λ λλ‘ μ ν μ, CPU μΊμκ° λΉμμ Έ μ±λ₯ μ νκ° λ°μν μ μμ
- μ€λ λ μν μ μ₯κ³Ό 볡μ
- GCDμ κ²½μ°, μ€λ λκ° λΈλ½λλ©΄ μμ
μ λ€λ₯Έ μ€λ λλ‘ λ³΄λΌ λ Full Thread Context Switching λ°©μμ μ¬μ©ν¨
- Swift Concurrency
- Thread Context Switching λ°©μμ μ¬μ©νμ§ μμ
- = μ 체 μ€λ λλ₯Ό μ ννλ κ²μ΄ μλ
- κ° μμ
μ λν΄ μ€λ λλ₯Ό μμ±νλ λμ Continuationμ ν λΉ
- νμ μ μ₯λμ΄ μ€λ λ κ° ν¨μ 컨ν
μ€νΈλ₯Ό 곡μ ν μ μμ
- κ²°κ΅ μ€λ λλ₯Ό μ ννμ§ μκ³ ν¨μ νΈμΆ μμ€μ λΉμ©μ΄ λ°μν¨
- νμ μ μ₯λμ΄ μ€λ λ κ° ν¨μ 컨ν
μ€νΈλ₯Ό 곡μ ν μ μμ
- Thread Context Switching λ°©μμ μ¬μ©νμ§ μμ
withCheckedContinuation
- Continuationμ μμ νκ² μ¬μ©ν μ μμ
- μΌμμ μ§ λ μ½λ λΈλ‘μ μνλ₯Ό μΆμ νκ³ μ΄νμ μμ νκ² μμ μ μ¬κ°ν μ μκ²ν΄μ€
- Completion Handlerλ‘ μμ±λ μ½λλ₯Ό κ°μΈμ€ Concurrency νκ²½μ ν¨μκ° μΌμμ μ§ ν μ¬μ€νλκ² λμμ€
func fetchData() async -> String {
// awaitμ ν΅ν΄ λ€λ₯Έ λΉλκΈ° μμ
μμ -> ν¨μ μΌμμ μ§
// withCheckedContinuationμ νΈμΆλκ³ λ΄λΆμμ continuation κ°μ²΄κ° μμ±λ¨
// - λΉλκΈ° μμ
μ μνλ₯Ό μΆμ
return await withCheckedContinuation { continuation in
someAsyncFunction { result in
// μμ
μ΄ μλ£λλ©΄ continuationμ ν΅ν΄ κ²°κ³Όλ₯Ό λ°ν
// - μΌμμ μ§λΌμλ ν¨μκ° λ€μ μ¬κ°λκ³ κ²°κ³Όκ° λ°νλ¨
continuation.resume(returning: result)
}
}
}
withUnsafeContinuation
- μ μμ€
- λ©λͺ¨λ¦¬ μμ μ±μ 체ν¬νμ§μμ κ°λ°μκ° μ¬μ©ν λ μ£Όμν΄μΌν¨
- μλͺ»μ°λ©΄ λ©λͺ¨λ¦¬ λμλ μλͺ»λ λ©λͺ¨λ¦¬ μ κ·Ό λ°μ
- CμΈμ΄λ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ ν΅ν© μ μ μ©ν μ μμ
- CμΈμ΄λ μΈλΆ λΌμ΄λΈλ¬λ¦¬μ λ©λͺ¨λ¦¬ κ΄λ¦¬λ λκΈ°ν λ°©μμ΄ Swiftμ λ€λ₯Ό μ μκΈ° λλ¬Έ
- μλ‘, CμΈμ΄λ μλ λ©λͺ¨λ¦¬ κ΄λ¦¬ λ°©μμ callbackκΈ°λ°μΌλ‘ λΉλκΈ°λ₯Ό μ²λ¦¬ν¨
func fetchData() async -> String {
return await withUnsafeContinuation { continuation in
someAsyncFunction { result in
continuation.resume(returning: result)
}
}
}
'Study' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
π Concurrency Docs λ΄ μΌλΆ (0) | 2024.09.11 |
---|---|
π WWDC21 : Explore structured concurrency in Swift (0) | 2024.09.07 |
π WWDC21: Meet async/await in Swift (0) | 2024.08.20 |
π ARC Docs μ 리 (0) | 2024.08.06 |
πΒ WWDC : ARC in Swift (0) | 2024.08.02 |