교육과정중에 이해되지 않았던 개념들을 차근차근 학습하면서 정리해볼 예정입니다.
<공부하면서 참고한 사이트들>
처음 해당 개념을 접했을 때
Serial/Concurrent
: 순차적으로 일을 처리? 동시에 처리?
Sync/Async
: 한번에 하나의 작업만 실행? 한번에 여러작업 진행?
위와 같은 맥락으로 이해하고 어라? 그럼 Serial == Sync
아닌가? 한번에 하나의 작업만 실행하니까 당연히 순차적인게 아닐까?
그럼 Serial Queue 에서 Async 작업은 무슨 의미가 있는거지?
동일한 쓰레드 내에서도 Async 로 추가한 작업은 동시에 처리될 수 있는건가?
하는 의문들 때문에 개념이 와닿지 않았고, 물론 지금도 학습하고 있지만 여전히 헷갈립니다.
func testPrint(emoji: String) {
for i in 1...3 {
print(i,emoji)
}
}
let serialQueue1 = DispatchQueue(label: "test")
serialQueue1.async { testPrint(emoji: "🐭") }
serialQueue1.async { testPrint(emoji: "🔥") }
serialQueue1.async { testPrint(emoji: "😿") }
serialQueue1.sync { testPrint(emoji: "💡") }
serialQueue
이기 때문에 동일한 쓰레드에 task들이 차곡차곡 쌓인다
1) SerialQueue 이기 때문에 순차적인 실행이 보장되기 때문에 쥐 -> 불 -> 고양이 -> 전구
순으로 출력될 것이다
2) 동일한 쓰레드라 할지라도 비동기적으로 처리되기 때문에 쥐,불,고양이
의 순서는 섞이지 않을까?
1), 2) 중 어떤 결과가 출력될까요?
1 🐭
2 🐭
3 🐭
1 🔥
2 🔥
3 🔥
1 😿
2 😿
3 😿
1 💡
2 💡
3 💡
1) 의 결과가 출력됩니다. 그럼 대체 Serial Queue
에 Async 로 추가한 작업들은 어떤 의미가 있는 걸까요?
링크 에서
단일 쓰레드에서도 비동기작업이 가능하다
라고 이해했는데 좀 더 학습이 필요할 것 같습니다
우선, 다른 블로그들의 예제들을 통해서 하나의 가설을 세웠습니다. (물론 틀렸을 수 있습니다. 정확한 개념을 이해하고 나면 다시 수정하겠습니다.)
Serial,Concurrent
의 차이는 queue에 저장된 task 들을 쓰레드에 어떻게 할당할 것인가? 에 대한 차이이다.
Serial
의 경우에는 하나의 쓰레드에 task들을 넣어주고 단일 쓰레드에서는 비동기, 동기 작업 상관없이 순서가 보장된다.Concurrent
의 경우에는 여러개의 쓰레드에서 동시에 작업을 진행하게 된다.
나름 이해했다고 생각했는데 블로그에 정리하니까 뒤죽박죽이다.. 내일 다시 새롭게 도전해야겠다.