야곰닷넷 - Concurrency Programming 심화

Groot·2022년 8월 24일
0

TIL

목록 보기
58/148
post-thumbnail

TIL

🌱 난 오늘 무엇을 공부했을까?

📌 야곰닷넷 - Concurrency Programming 심화

📍 DispatchQueue의 초기화

convenience init(label: String,
                 qos: DispatchQoS = .unspecified,
                 attributes: DispatchQueue.Attributes = [],
                 autoreleaseFrequency: DispatchQueue.AutoreleaseFrequency = .inherit,
                 target: DispatchQueue? = nil)

🔗 label

  • 디버깅 환경에서 추적하기 위해서 작성하는 String
  • 여러개의 DispatchQueue를 구분하기 위해서 사용

🔗 qos

  • 무엇에 더 많은 에너지를 쏟을지 정하는 우선순위
  • 우선 순위가 높을 수록 더 많은 전력
    • User-interactive <-- 가장 높음
    • User-initiated
    • Default
    • Utility
    • Background
    • Unspecified <-- 가장 낮음

🔗 attributes

  • DispatchQueue의 속성
  • .concurrent : 다중 스레드 환경에서 코드를 처리
  • .initiallyInactive : sync나 async를 호출하더라도 작업을 큐에 담아놓을 뿐, active()를 호출하기 전까지는 작업을 처리하지 않는 것
let grootDispatchQueue = DispatchQueue(label: "groot", attributes: .initiallyInactive)

grootDispatchQueue.async {
    print("active를 실행해야 코드 블록 호출")
}
grootDispatchQueue.activate()
  • 기본 값으로 아무 설정을 하지 않는다면 Serial

🔗 autoreleaseFrequency

  • DispatchQueue가 자동으로 객체를 해제하는 빈도의 값을 결정하는 파라미터
  • 객체를 autorealease해주는 빈도이며 기본값은 inherit입니다.
    • inherit: target과 같은 빈도를 가집니다.
    • workItem: workItem이 실행될 때마다 객체들을 해제합니다.
    • never: autorelease를 하지 않습니다.

🔗 target

  • 코드 블록을 실행할 큐를 target으로 설정

📍 async

func async(group: DispatchGroup? = nil, qos: DispatchQoS = .unspecified, flags: DispatchWorkItemFlags = [], execute work: @escaping () -> Void)

🔗 group

  • DispatchQueue의 async 코드 블록을 묶어서 관리해주는 DispatchGroup
  • DispatchGroup은 비동기적으로 처리되는 작업들을 그룹으로 묶어, 그룹 단위로 작업 상태를 추적할 수 있는 기능
  • 이때 묶어줄 async 작업들이 꼭 같은 큐, 스레드에 있지 않더라도 묶어줄 수 있다.
group에 등록하기: enter, leave
  • DispatchGroup을 사용하는 방법은 2가지
    – async를 호출하면서 파라미터로 group을 지정하는 방법.
    – enter, leave를 코드의 앞뒤로 호출하여 group을 지정하는 방법.
let group = DispatchGroup()

// enter, leave를 사용하지 않는 경우
DispatchQueue.main.async(group: group) {}
DispatchQueue.global().async(group: group) {}

// enter, leave를 사용하는 경우
group.enter()
DispatchQueue.main.async {}
DispatchQueue.global().async {}
group.leave()

group.notify(queue: .main) {
    print("모든 작업이 끝났습니다.")
}

group.wait()
print("모든 작업이 끝났습니다.")

// group.wait(timeout: 10)
// print("모든 작업이 끝났습니다."
notify
  • notify는 DispatchGroup의 업무 처리가 끝나는 시점에 원하는 동작을 수행하기 위한 메서드
wait
  • wait는 DispatchGroup의 수행이 끝나기를 기다리기만 하는 메서드입니다. notify와 달리 별도의 코드 블록을 실행하지 않는다.
  • wait 메서드에는 timeout 파라미터를 설정해줄 수 있다.
  • 만약 timeout에 10을 전달하면 group을 딱 10초 동안만 기다리는 것
  • 만약 10초가 넘어갔는데도 group의 작업이 끝나지 않는다면 더 이상 기다리지 않고 다음 코드를 실행

🔗 qos

  • 무엇에 더 많은 에너지를 쏟을지 정하는 우선순위

🔗 flags

  • DispatchWorkItemFlags 타입의 값을 받는 파라미터
    • assingCurrentContext: 코드 블록을 실행하는 context(Queue 혹은 스레드)의 속성을 상속받습니다. QoS와 같은 속성을 동일하게 한다는 이야기입니다.
    • barrier: concurrnet queue 환경에서 barrier(장벽, 차단) 역할을 합니다. barrier 속성의 코드 블록이 실행되기 전에 실행되었던 코드들은 완료까지 실행되고, barrier 속성의 코드 블록이 실행되기 전까지 다른 코드 블록은 실행되지 않습니다.
    • detached: 실행할 코드 블록에 실행 중인 context(Queue 혹은 스레드)의 속성을 적용하지 않습니다.
    • enforceQoS: 실행 중인 context의 QoS보다 실행할 코드 블록의 QoS에 더 높은 우선 순위를 부여합니다.
    • inheritQoS: enforceQoS와 반대로 실행 중인 context의 QoS에 더 높은 우선 순위를 부여합니다.
    • noQoS: QoS를 할당하지 않고 코드 블록을 실행시킵니다. assingCurrentContext보다 우선시 되는 속성입니다.

🔗 completionHandler

  • 함수의 실행순서를 보장받을 수 있는 클로저
  • completionHandler와 같은 클로져를 사용하는 경우에는 비동기 메서드일 때에도 작업이 종료되는 시점을 추적할 수 있고, 순서를 보장받을 수 있다.
    참고 - 야곰닷넷
profile
I Am Groot

0개의 댓글