동기(Sync) vs 비동기(Async)
둘 다 다른 쓰레드로 작업을 보내는 것은 동일하다.
동기 (Sync)
•
다른 쓰레드로 작업을 보내고, 그 작업이 끝날 때까지 기다린다.
•
작업이 끝나야 다른 작업을 시작할 수 있다.
print("1")
syncMethod()
// 동기함수(5초동안 일처리 함수)
// 5초동안 기다렸다 일이 다 끝나고 다음줄로 넘어감
// 2번 쓰레드에서 하는 일이 다 끝날떄까지 기다렸다가
print("2")
Swift
복사
비동기 (Async)
•
다른 쓰레드로 작업을 보내고, 그 작업이 끝나는 것을 기다리지 않고 다른 작업을 시작한다.
print("1")
asyncMethod()
// 비동기함수(5초동안 일처리 함수)
// 안기다리기 때문에 바로 다음줄로 넘어감
// 2번 쓰레드에서 하는 일이 다 끝날때까지 기다리지 않음
print("2")
Swift
복사
예시
프린트집을 하고 있을 때, 나에게는 A, B, C, D 복사기가 4대 있다. 학생 2명이 나에게 300장 짜리 복사를 맡겼다.
•
동기(Sync)일 경우
◦
A 복사기에 100장 복사를 시작했다. 근데 다른 복사기를 사용할 수 없다. A 복사기의 복사가 먼저 끝나야 하기 때문이다.
•
비동기(Async)일 경우
◦
A 복사기에 100장 복사를 시작했다. A 복사기의 복사가 끝나는 것에 상관없이 B, C 복사기에도 100장 복사를 시작했다.
작업의 순서에만 집중해서 보면, 차이가 극명하게 보일 것이다.
동기는 설계가 간단하고 직관적이지만, 결과가 주어질 때까지 대기를 해야하는 단점이 있고, 비동기는 설계는 복잡하지만 자원을 효율적으로 사용할 수 있다는 장점이 있다.
비동기 처리
print("1")
DispatchQueue.global().async {
task6()
}
DispatchQueue.global().async {
task7()
}
DispatchQueue.global().async {
task8()
}
DispatchQueue.global().async {
task9()
}
DispatchQueue.global().async {
task10()
}
print("2")
/*
1
2
Task 6 시작
Task 7 시작
Task 8 시작
Task 9 시작
Task 10 시작
Task 7 완료★
Task 10 완료★
Task 6 완료★
Task 9 완료★
Task 8 완료★
*/
Swift
복사
비동기적인 함수의 정의
// 비동기적인 함수의 정의
func task4() {
DispatchQueue.global().async {
print("Task 4 시작")
sleep(2)
print("Task 4 완료★")
}
}
func task5() {
DispatchQueue.global().async {
print("Task 5 시작")
sleep(2)
print("Task 5 완료★")
}
}
func task6() {
DispatchQueue.global().async {
print("Task 6 시작")
sleep(2)
print("Task 6 완료★")
}
}
Swift
복사
직렬(Serial) vs 동시(Concurrent)
•
큐에 특성에 관한 것
직렬 (Serial)
•
분산처리 시킨 작업을 오직 한 개의 쓰레드에서만 처리하는 것
•
즉, A 쓰레드에서 4개의 작업을 분산처리 시켰는데, B 쓰레드에서만 처리하는 것이다.
•
순서가 중요한 작업을 처리할 때 사용
직렬 큐
let serialQueue = DispatchQueue(label: "com.inflearn.serial")
serialQueue.async {
task1()
}
serialQueue.async {
task2()
}
serialQueue.async {
task3()
}
Swift
복사
동시 (Concurrent)
•
몇 개의 쓰레드로 분산할지는 시스템이 정하지만, 시스템이 정한 여러 개의 쓰레드로 분산 처리하는 것.
•
작업들이 각자 독립적이지만 유사한 작업들일 때, 굉장히 유용하다 (예를 들면, 테이블뷰 셀 같은 것들을 서버에서 받아오는 것)
동시 큐
let concurrentQueue = DispatchQueue.global()
concurrentQueue.async {
task1()
}
concurrentQueue.async {
task2()
}
concurrentQueue.async {
task3()
}
Swift
복사
비동기와 동시는 비슷한 개념?
•
비동기와 동시는 비슷해보이지만 아예 다른 개념!
•
동기와 비동기는 메인 쓰레드에서 대기열을 어떤 방식으로 처리할 지 정하는 것.
•
직렬과 동시는 어떤 대기열을 사용할 지 정하는 것
직렬을 사용하는 이유
•
바로 작업의 ‘순서’가 중요할 때 직렬이 사용된다.
•
동시는 여러 개의 쓰레드에서 분산 작업하기 때문에 순서를 상관하지 않고, 쓰레드에 할당된 작업은 각 쓰레드가 모조리 처리한다.
•
따라서, 만약 어떤 작업이 꼭 먼저 이뤄져야 한다면, 그럴떄는 직렬을 사용하는 게 좋다.
왜 동시성 프로그래밍이 iOS에 필요할까?
성능/반응성
최적화
분산처리
→ GCD / Operation