티스토리 뷰

iOS

[iOS] DispatchQueue 알아보기

Kim_Baechu 2021. 1. 18. 19:25

DispatchQueue

앱의 메인스레드나 백그라운드 스레드에서 순차적serially이거나 동시concurrently에 작업 실행을 관리하는 객체입니다.

class DispatchQueue : DispatchObject

 

DispatchQueue Overview

디스패치 큐는 블록객체 형식으로 작업을 제출하는 FIFO 대기열입니다.

디스패치 큐는 작업을 serially또는 concurrently 실행합니다.

디스패치 큐에 제출된 작업은 시스템에서 관리하는 스레드 풀에서 실행됩니다.

앱의 매인 스레드를 나타내는 디스패치 큐를 제외하고 시스템은 어떤 스레드를 사용하여 작업을 실행할지 보장하지 않습니다.

 

작업 항목(Work Item)을 동기synchronously, 비동기asynchronously로 계획할 수 있습니다.

작업 항목을 동기로 계획하면 코드가 해당 항목의 실행이 완료될 때까지 기다립니다.

(your code waits until that item finishes execution.)

비동기로 작업을 계획하면 작업 항목이 다른 곳에서 실행되는 동안 코드가 계속 실행됩니다.

(your code continues executing while the work item runs elsewhere.)

 

매인 큐에서 동기적으로 작업을 실행하면 deadlock이 발생합니다.

Avoiding Excessive Thread Creation

concurrent 작업을 설계할 때 현재 스레드의 실행을 block하는 메서드를 호출하지 마세요.

concurrent 디스패치 큐로 계획된 작업이 스레드를 block하면 시스템은 대기 중인 다른 concurrent 작업을 실행하기 위해 추가 스레드를 생성합니다.

너무 많은 작업이 차단되면 당신의 앱에서 시스템에 스레드가 부족해질 수 있습니다.

 

앱이 너무 많은 스레드를 소비하는 다른 방법은 너무 많은 private concurrent 디스패치 큐를 만드는 것입니다.

각 디스패치 큐는 스레드 리소스를 사용하기 때문에 추가 concurrent 디스패치 큐를 생성하면 스레드 소비 문제가 악화됩니다.

private concurrent 큐를 만드는 대신 global concurrent 디스패치 큐 중 하나에 작업을 제출하세요.

serial 작업의 경우 순차 큐의 타겟을 global concurrent 큐 중에 하나에 설정하세요.

이렇게 하면 스레드를 생성하는 개별 큐의 수를 최소화하면서 큐의 순차 행동을 유지할 수 있습니다.

 

developer.apple.com/documentation/dispatch/dispatchqueue

 

Apple Developer Documentation

 

developer.apple.com

 

Serial/Concurrent가 여러 작업들 간의 실행/종료의 순서를, Sync/Async가 하나의 작업을 요청했을 때 응답의 대기 여부를 의미

참고 : cskime.github.io/2020/07/27/serial-concurrent-sync-async/

 

댓글
공지사항