Study

πŸ‘€ Continuation μ•Œμ•„λ³΄κΈ°

_yunie 2024. 8. 24. 23:38

πŸ‘€ Continuation ?

  • async λ©”μ„œλ“œ 호좜 μ‹œ, μŠ€λ ˆλ“œμ˜ μ œμ–΄κΆŒμ„ ν¬κΈ°ν•˜λŠ” suspended ν˜„μƒμ΄ λ°œμƒν•¨
    • μ œμ–΄κΆŒμ΄ λ‹€μ‹œ λŒμ•„μ™”μ„ λ•Œ, μ–΄λ””μ„œλΆ€ν„° μ‹€ν–‰ν•  지에 λŒ€ν•œ 정보가 μžˆμ–΄μ•Όν•¨
      • 이 λ•Œ, Suspension Pointsλ₯Ό 톡해 νŒŒμ•…ν•˜κ³  μ€‘μ§€λœ μ‹œμ λΆ€ν„° μž¬μ‹€ν–‰ν•¨
        • 이처럼 μž‘μ—…μ΄ μΌμ‹œμ •μ§€λ˜κ³  κ·Έ μ‹œμ λΆ€ν„° μž¬μ‹€ν–‰λ˜λŠ” 것을 Continuation 이라고 λͺ…μΉ­

 

Suspension Point

  • Swift Concurrency μž‘μ—…μ΄ μΌμ‹œμ •μ§€λ˜μ–΄ κ²°κ³Όλ₯Ό κΈ°λ‹€λ¦¬λŠ” 지점
    • = 비동기 μž‘μ—… μ™„λ£Œ ν›„ λ‹€μ‹œ μ‹€ν–‰λ˜λŠ” μ‹œμ 
  • ❓ Heap에 μ €μž₯λ˜λŠ” 이유
    • 비동기 μž‘μ—…μ˜ μƒνƒœ 좔적
      • νž™μ€ λ™μ μœΌλ‘œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•΄ λ³΅μž‘ν•œ μƒνƒœλ₯Ό μœ μ§€ν•  수 있음
    • λ©”λͺ¨λ¦¬ 관리
      • 비동기 ν•¨μˆ˜κ°€ μΌμ‹œμ •μ§€λ˜μ—ˆμ„ λ•Œμ—λ„ λ©”λͺ¨λ¦¬ 상에 계속 ν•΄λ‹Ή 지점이 λ‚¨μ•„μžˆμ–΄μ•Όν•¨
        • 즉, ν•΄λ‹Ή κ°μ²΄λŠ” ν•¨μˆ˜μ˜ 호좜의 수λͺ…이 μ•„λ‹Œ 비동기 μž‘μ—…μ˜ 수λͺ…을 따라감
          • 고둜 비동기 μž‘μ—…μ΄ 끝날 λ•ŒκΉŒμ§€ λ‚¨μ•„μžˆμ–΄μ•Όν•˜λ―€λ‘œ νž™μ— μ €μž₯됨
      • λ§Œμ•½ μŠ€νƒμ— μ €μž₯ν•˜λŠ” 경우, 이후 μƒˆλ‘œμš΄ await에 μ˜ν•΄ ν•΄λ‹Ή λ³€μˆ˜κ°€ λ³€κ²½λ˜κ±°λ‚˜ λ³€μˆ˜ μžμ²΄κ°€ μ‚¬λΌμ§ˆ 수 있음
    • λ©€ν‹°μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œμ˜ λ™μ‹œμ„± 관리
      • 비동기 μž‘μ—…μ€ μ—¬λŸ¬ μŠ€λ ˆλ“œμ—μ„œ λ™μ‹œμ— 싀행될 수 있음
        • μƒνƒœλ₯Ό μ•ˆμ „ν•˜κ²Œ κ΄€λ¦¬ν•˜κΈ° μœ„ν•΄ μƒνƒœ 객체가 νž™μ— μžˆμ–΄μ•Όν•¨
          • 결과적으둜 각 비동기 μž‘μ—…λ“€μ΄ λ…λ¦½μ μœΌλ‘œ 각자의 μƒνƒœλ₯Ό μ €μž₯ν•˜κ³  관리할 수 있음

 

GCDμ™€μ˜ 차이

  • GCD
    • GCD의 경우, μŠ€λ ˆλ“œκ°€ λΈ”λ½λ˜λ©΄ μž‘μ—…μ„ λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ 보낼 λ•Œ Full Thread Context Switching 방식을 μ‚¬μš©ν•¨
      • μ΄λŠ” λ§Žμ€ λΉ„μš©μ΄ λ°œμƒν•¨
      • - λ°œμƒ λΉ„μš©
        • μŠ€λ ˆλ“œ μƒνƒœ μ €μž₯κ³Ό 볡원
          • ν˜„μž¬ μ‹€ν–‰ 쀑인 μŠ€λ ˆλ“œμ˜ λ ˆμ§€μŠ€ν„° κ°’, PC 등을 μ €μž₯ν•˜κ³  λ‹€λ₯Έ μŠ€λ ˆλ“œλ‘œ μ „ν™˜μ‹œ 볡원
        • μŠ€μΌ€μ€„λ§
          • μ μ ˆν•œ μŠ€λ ˆλ“œλ₯Ό μ„ νƒν•˜κ³  μŠ€μΌ€μ€„λ§ν•˜λŠ” 과정을 κ±°μΉ¨
            • 이λ₯Ό 톡해 μ‹œκ°„κ³Ό λ¦¬μ†ŒμŠ€κ°€ μ†Œλͺ¨λ¨
        • Cache miss
          • μƒˆλ‘œμš΄ μŠ€λ ˆλ“œλ‘œ μ „ν™˜ μ‹œ, CPU μΊμ‹œκ°€ λΉ„μ›Œμ Έ μ„±λŠ₯ μ €ν•˜κ°€ λ°œμƒν•  수 있음
  • Swift Concurrency
    • Thread Context Switching 방식을 μ‚¬μš©ν•˜μ§€ μ•ŠμŒ
      • = 전체 μŠ€λ ˆλ“œλ₯Ό μ „ν™˜ν•˜λŠ” 것이 μ•„λ‹˜
    • 각 μž‘μ—…μ— λŒ€ν•΄ μŠ€λ ˆλ“œλ₯Ό μƒμ„±ν•˜λŠ” λŒ€μ‹  Continuation을 ν• λ‹Ή
      • νž™μ— μ €μž₯λ˜μ–΄ μŠ€λ ˆλ“œ κ°„ ν•¨μˆ˜ μ»¨ν…μŠ€νŠΈλ₯Ό κ³΅μœ ν•  수 있음
        • κ²°κ΅­ μŠ€λ ˆλ“œλ₯Ό μ „ν™˜ν•˜μ§€ μ•Šκ³  ν•¨μˆ˜ 호좜 μˆ˜μ€€μ˜ λΉ„μš©μ΄ λ°œμƒν•¨

 

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