Notice
Recent Posts
Recent Comments
Link
大器晩成
iOS- 동시성 프로그래밍 (Concurrent Sync/Async) 본문
이전 포스팅에서는 Serial 상태에서 Sync와 Async를 알아봤습니다.
이번 포스팅에서는 Concurrent Sync/Async를 정리해 보도록 하겠습니다.
Concurrent Sync
func ConcurrentSync() {
print("START")
print("첫번째 작업 시작")
DispatchQueue.global().sync {
for i in 1...10 {
print(i, terminator: " ")
}
}
DispatchQueue.global().sync {
for i in 21...30 {
print(i, terminator: " ")
}
}
print("\n두번째 작업 시작")
for i in 11...20 {
print(i, terminator: " ")
}
print("\nEnd")
}
ConcurrentSync()
//Result
START
첫번째 작업 시작
1 2 3 4 5 6 7 8 9 10 21 22 23 24 25 26 27 28 29 30
두번째 작업 시작
11 12 13 14 15 16 17 18 19 20
End
- Start 실행 후 1 to 10 출력에 대한 업무와 21 to 30를 다른 스레드에 넘긴 상태이며, 먼저 큐에 담겨있는 작업을 수행하고 해당 작업이 완료된 후에 메인 스레드로 돌아와 수행하기 때문에 시리얼 싱크와 동일하게 동작한다.
- 그림으로 보면 다음과 같습니다. 메인 스레드는 메인스레드 일을 하다가, 큐에 업무를 넘기게 되면, 메인스레드는 대기상태가 되며, GCD는 임의에 스레드에 업무를 할당하고, 업무를 마치게 된 다음 메인 스레드에게 업무의 주도권을 넘기게 됩니다.
- 실질적으로는 메인스레드에서 동작하는 것이 동일하기 때문에, GCD는 다른 스레드에 업무를 할당하지 않고, 모든 일은 메인 스레드에서 동작하게 됩니다.
Concurrent Async
func ConcurrentAsync() {
print("START")
print("첫번째 작업 시작")
DispatchQueue.global().async {
for i in 0..<5 {
print("나는 1번")
}
}
print("\n두번째 작업 시작")
for i in 11...20 {
print(i, terminator: " ")
}
DispatchQueue.global().async {
for i in 0..<5 {
print("나는 3번")
}
}
DispatchQueue.global().async {
for i in 0..<5 {
print("나는 4번")
}
}
print("\nEnd")
}
ConcurrentAsync()
// Result
START
첫번째 작업 시작
두번째 작업 시작
11 12 13 14 15 16 17 나는 1번
18 나는 1번
나는 1번
나는 1번
19 20
End
나는 1번
나는 4번
나는 3번
나는 4번
나는 4번
나는 4번
나는 3번
나는 4번
나는 3번
나는 3번
나는 3번
- 비동기 방식이기 때문에, 메인 스레드는 큐에 넣은 작업과 별개로 자기 자신의 일을 하고 있으며, Concurrent 방식이기 때문에, 멀티 스레드로 동작을 하기 때문에, 각 업무드를 GCD에 의해 다른 스레드로 업무를 할당받고 있으며, 그 업무를 수행하고 있습니다.
- 컴파일할 때마다 결과가 다르기 때문에 어떤 업무가 마지막에 실행되는지는 모르는 단점이 있습니다.
- 그림으로 보면 각 업무들은 큐로 보내지면, GCD에 의해서 랜덤으로 스레드에 할당 및 수행하게 되고, 메인은 별도의 기다림 없이 자기의 업무를 실행합니다.
Serial, Concurrent, sync, async가 비슷해 보일 수 있지만 전혀 다른 개념이기 때문에 헷갈릴 필요가 없습니다.
- sync, async는 작업을 보내는 시점에서 기다릴지 말지를 결정합니다.
- concurrent와 serial은 작업들을 여러 개의 스레드로 보낼 것인지 한 개의 스레드로 보낼 것인지를 결정합니다.
Sync | Async | |
Serial | 메인 스레드의 작업 흐름이 큐에 넘긴 task가 끝날 때 까지 멈춰있고, 넘겨진 task는 큐에 먼저 담겨있던 작업들과 같은 스레드로 보내지기 때문에, 메인 스레드는 큐에 작업이 모두 끝나야 실행됩니다. | 메인 스레드의 작업 흐름은 task를 큐에 넘기자 마자 반환되기 때문에, 메인스레드가 먼저 실행이되고, task는 큐에 먼저 담겨있던 작업들과 같은 스레드에 보내지기 때문에 메인 스레드의 작업이 끝나야 다른 스레드의 할당된 작업들이 실행됩니다. |
Concurrent | 메인 스레드의 작업흐름이 큐에 넘긴 task가 끝날 때 까지 멈춰 있고, 넘겨진 Task는 큐에 먼저 담겨있던 작업들이 다른 스레드로 보내질 수 있어도, 해당 큐에 담긴 작업들이 모두 끝난 후에야 메인 스레드가 동작합니다. | 메인 스레드의 작업 흐름이 task를 큐에 넘기자 마자 반환되며, 넘겨진 테스크들은 큐에 먼저 담겨있던 작업들과 함께 GCD에 의해 다른 스레드로 할당되며, 스레드 작업이 끝나지 않아도 메인 스레드는 별도로 동작합니다. |
728x90
'iOS > Swift' 카테고리의 다른 글
DI와 DIP (0) | 2025.03.10 |
---|---|
GCD QOS (0) | 2025.01.20 |
iOS- 동시성 프로그래밍 (Serial Sync/Async) (0) | 2025.01.20 |
iOS GCD (0) | 2025.01.20 |
iOS GCD - MultiTread (0) | 2025.01.20 |