iOS의 직렬 큐(Serial Queue)와 동시 큐(Concurrent Queue)

1번 쓰레드(Main Thread)에 몰려있는 작업을 다른 여러 개의 쓰레드로 분산 처리하여 작업하는 방식을 "동시성"이라 부릅니다.

이러한 동시성 방식은 작업의 시간과 종료의 순서가 다릅니다. (대기행렬 큐(Queue)에서 작업을 임의로 분산 처리하기 때문)


🤔 하지만 작업의 시작/종료 순서가 중요하면 어떻게 해야 할까??

-> 직렬 큐(Serial Queue)를 사용!!



📌 동시 큐(Concurrent Queue)

동시성 방식으로 프로그래밍할 경우 작업의 시작/종료 순서가 그때그때 다릅니다.

func work_1(){
    print("작업1 시작")
    sleep(2)
    print("종료1\n")
}
func work_2(){
    print("작업2 시작")
    sleep(2)
    print("종료2\n")
}
func work_3(){
    print("작업3 시작")
    sleep(2)
    print("종료3\n")
}

DispatchQueue.global().async {
    work_1()
}
DispatchQueue.global().async {
    work_2()
}
DispatchQueue.global().async {
    work_3()
}

/* 출력 결과
 작업1 시작
 작업3 시작
 작업2 시작
 종료2

 종료1

 종료3
 */

📌 직렬 큐(Serial Queue)

작업의 시작/종료 순서가 중요하다면 직렬 큐(Serial Queue)를 사용하면 됩니다.

하지만 직렬 큐의 경우에는 일정 작업의 묶음을 통째로 다른 쓰래드에게 분산처리 하는 방식이기 때문에 버벅임의 문제가 발생할 수 있습니다.

func work_1(){
    print("작업1 시작")
    sleep(2)
    print("종료1\n")
}
func work_2(){
    print("작업2 시작")
    sleep(2)
    print("종료2\n")
}
func work_3(){
    print("작업3 시작")
    sleep(2)
    print("종료3\n")
}

let serialQueue = DispatchQueue(label: "임의의_이름")
serialQueue.async {
    work_1()
}
serialQueue.async {
    work_2()
}
serialQueue.async {
    work_3()
}

/* 출력 결과
 작업1 시작
 종료1

 작업2 시작
 종료2

 작업3 시작
 종료3
 */
profile
응애 나 코린이(비트코인X 코딩O)

0개의 댓글