DispatchQueue.main과 custom Queue의 차이

현재 GCD 관련 코드들을 테스트 중 한가지 이유를 모르겠는 상황이 발견되어 질문을 올리게 되었습니다.

        DispatchQueue.main.async {
        for i in 0..<100 {
            print("🤖", i)
        }
        //👇그냥 선언하면 DispatchQueue.main.sync로 들어감.
        }
        for i in 100..<200 {
            print("Ⓜ️", i)
        }

위 같은 코드에서는 출력시 반드시 DispatchQueue,main.sync 내부의 코드가 먼저 실행되고 난 후 main.async 내부의 코드가 출력됩니다.


(아래 코드 참고)그런데 이와 비슷하게 Serial Custom Queue를 하나 만들어서 테스트를 해본 결과 이의 경우에는 반대로 async 내부의 코드가 반드시 먼저 출력이 되더군요…

let queue = DispatchQueue(label: "uniqueLabel")

queue.async {
for i in 0..<100 {
print("🤖", i)
    }
}
    
queue.sync {
for i in 100..<200 {
print("Ⓜ️", i)
    }
}

제 추측 : main queue는 무조건 main thread에서만 업무를 처리함. 그래서 async인 업무의 자리에 sync 업무가 들어와서 sync 업무가 다 처리된 후에 async 업무가 실행되었다고 생각합니다. 이 생각을 바탕으로 custom queue에서는 왜 저렇게 뜨는지 접근을 해보았는데, 큐에서 업무를 배분하는 쓰레드에 차이가 있는 건가? 라는 생각밖에 들지가 않습니다.

제가 공부한 바에 따르면 DispatchQueue.main.queue 자체가 Serial Queue이고 custom queue도 serial이라 다르게 실행되면 안될 것 같다는 생각이 드는데 왜 다르게 나오는지 도저히 이유를 모르겠습니다…

좋아요 1

async와 sync는 동기식/비동기식 동작 차이에요.

async는 비동기 방식이라서 태스크의 시작과 끝이 동기되지 않아요. 태스크가 시작되면 끝날 때까지 기다리지 않죠.

sync는 동기 방식이라서 태스크의 시작과 끝이 동기됩니다. 즉 태스크가 시작하고 끝나야 다음이 실행되요.

큐에 async/sync 하는 것은 큐에 추가한 태스크들이 종료될 때까지 대기하느냐 아니냐의 차이로 보면 됩니다.

아래는 간단히 작성한 샘플이에요. Task queued가 언제 동작하는지 확인해보면 명확할거에요.

let queue = DispatchQueue(label: "MyQueue")

queue.async {
    print("Task1 Done")
}
print("Task1 queued")

queue.sync {
    print("Task2 Done")
}
print("Task2 queued")

좋아요 3

감사합니다! 제 예제가 좀 어색했군요 ㅎㅎ main 큐나 custom 큐나 똑같이 작동하는 것이었네요

좋아요 1