본문 바로가기
Languages/Swift

GCD & Operations - Concurrency by Tutorials

by 탄이. 2020. 5. 23.

https://store.raywenderlich.com/products/concurrency-by-tutorials

Section 1: Getting Started with Concurrency

Chapter 1: Introduction

  • iOS가 코드를 동시에 실행할 수있는 기능을 제공하는 두 가지 주요 방법

    1. Grand Central Dispatch
    2. Operation class
  • 최신 프로그래밍 언어들의 서로다른 동시성 처리 매커니즘

    • C# / Typescript
      • async / await 패턴 사용
    • Swift
      • Closure

    Swift 5는 원래보다 일반적인 async / await 패턴을 구현할 계획이 있었지만 다음 릴리스까지 사양에서 제거되었습니다.


Chapter 2: GCD & Operations

  • 앱의 동시성을 구현할 때 이 둘 중에서 반드시 하나만 사용해야 하는 것이 아닙니다.
  • 실제로, Operations는 GCD 위에 구축되었습니다!

Grand Central Dispatch

  • 애플이 C의 libdispatch 라이브러리를 구현 한 것입니다.
  • 그 목적은 자원의 가용성에 따라 병렬로 실행될 수있는 작업(메소드 또는 클로저)을 대기열에 넣는 것입니다.
  • 그런 다음 사용 가능한 프로세서 코어에서 작업을 실행합니다.
  • GCD는 구현시 스레드를 사용하지만 개발자는 스레드 관리에 대해 걱정할 필요가 없습니다.
  • GCD가 관리하는 모든 작업은 GCD 관리 방식의 FIFO(First-First, First-Out) 대기열에 배치됩니다.
  • 그런 다음 큐에 제출 한 각 작업은 시스템에서 완전히 관리하는 스레드 풀에 대해 실행됩니다.

작업을 실행할 스레드에 대해서는 보장 할 수 없습니다.

Synchronous and asynchronous tasks

대기열은 FIFO 기반이지만 제출 한 순서대로 작업이 완료되는 것을 보장하지는 않습니다. FIFO 절차는 작업이 완료 될 때가 아니라 작업이 시작될 때 적용됩니다.

// Class level variable 
let queue = DispatchQueue(label: "com.raywenderlich.worker")

// Somewhere in your function 
queue.async { 
	// Call slow non-UI methods here

	DispatchQueue.main.async { 
		// Update the UI here 
	}
}

Serial and concurrent queues

concurrent queue을 사용하겠다고 iOS에 알릴 수 있지만 한 번에 둘 이상의 작업이 실행된다는 보장은 없습니다. iOS 기기가 완전히 작동하지 않고 앱이 리소스를 놓고 경쟁하는 경우 단일 작업 만 실행할 수 있습니다.

Asynchronous doesn’t mean concurrent (비동기는 동시성을 의미하지 않습니다.)

  • 실제로 직렬 큐 또는 동시 큐로 비동기 작업을 제출할 수 있으며,
  • 동기식 또는 비동기식 작업은 작업을 실행 중인 큐가 다음 작업을 생성하기 전에 완료되기를 기다려야 하는지 여부를 식별하는 데 불과하다.
    • 즉, 작업이 동기냐 비동기냐 하는 이야기는 작업의 작동방식을 말해줍니다.
  • 반면, 어떤 것을 직렬 대 동시성으로 분류하면 큐에 사용할 수 있는 단일 스레드가 있는지 여러 개의 스레드가 있는지 여부를 식별한다.
    • 직렬적이거나 동시적인 것은 그 작업의 목적지를 말해준다.

직렬 큐 : 연결된 단일 스레드만 있으므로 지정된 시간에 단일 태스크만 실행할 수 있다. 동시 큐 : 시스템에 필요한 만큼의 스레드를 활용할 수 있다. 스레드는 동시 대기열에서 필요에 따라 생성 및 릴리스된다. 동기식 작업 : 작업을 실행 중인 큐가 다음 작업을 생성하기 전에 완료되길 기다림 비동기식 작업 : 작업을 실행 중인 큐가 다음 작업을 생성하기 전에 완료되길 기다리지 않음

Operations

  • GCD는 백그라운드에서 한 번만 실행해야하는 일반적인 작업에 적합합니다.
  • 이미지 편집 작업과 같이 재사용 할 수있는 기능을 구축 할 때 해당 기능으로 Operation을 서브클래싱함으로써 그 목표를 달성 할 수 있습니다!

Operation subclassing

  • Operations는 GCD용 DispatchQueue에 작업의 클로저를 제출하는 것과 마찬가지로 OperationQueue에 제출될 수 있는 완전한 기능을 가진 클래스이다.
  • 그것들은 클래스이고 변수를 포함 할 수 있기 때문에 주어진 시점에서 작업 상태를 알 수 있습니다.
  • Operations는 다음 상태 중 하나로 존재할 수 있습니다.
    • isReady
    • isExecuting
    • isCancelled
    • isFinished
  • GCD와 달리 Operation은 기본적으로 동기식으로 실행되며 비동기식으로 실행하려면 더 많은 작업이 필요합니다.
    • 직접 작업을 직접 수행 할 수는 있지만 동기 특성으로 인해 좋은 아이디어는 아닙니다.
    • UI 성능에 영향을 미치지 않도록 OperationQueue에 제출하여 기본 스레드에서 가져와야 합니다.

BlockOperation

  • 때로는 앱에서 Operation을 많이 사용하는 자신을 발견합니다. 하지만, GCD와 같은 더 간단한 클로저가 필요하다는 것을 알 수 있습니다.

  • DispatchQueue도 작성하지 않으려는 경우 BlockOperation 클래스를 대신 사용할 수 있습니다.

  • BlockOperation은 사용자를 위해 Operation을 서브클래스하고 기본 글로벌 큐에서 하나 이상의 클로저의 동시 실행을 관리합니다.

  • 그러나 실제 Operation 서브클래스가 되면 Operation의 다른 모든 기능을 활용할 수 있습니다.

Block operation은 동시로 실행됩니다. 직렬로 실행해야하는 경우 대신 dispatch queue를 설정해야합니다.

어느 것을 사용해야 합니까?

  • GCD는 실행하고 잊어버릴 간단한 작업을 위해 작업하기가 더 쉬운 경향이 있습니다.
  • Operations은 작업을 추적하거나 취소 기능을 유지해야 할 때 훨씬 더 많은 기능을 제공합니다.
  • 실행해야하는 메소드 또는 코드 덩어리만 사용하는 경우 GCD가 적합합니다.
  • 데이터와 기능을 캡슐화해야하는 개체로 작업하는 경우 Operations을 활용할 가능성이 높습니다.

댓글