📌 스레드(Thread)란?
▶️ 정의
스레드(Thread)는 컴퓨터 프로세스 내에서 실행되는 실행 흐름의 단위이다.
프로세스는,
운영체제로부터 자원을 할당받아 실행 중인 프로그램의 인스턴스를 나타내는데,
각각의 프로세스는 하나 이상의 스레드를 가질 수 있다.
▶️ Swift에서의 스레드 종류
1. 메인 스레드 (Main Thread)
메인 스레드는 애플리케이션의 주요 인터페이스 및 UI 업데이트를 담당하는 스레드이다.
UI 요소의 변경은 메인스레드에서 수행되어야 한다.
2. 백그라운드 스레드 (Background Threads)
백그라운드 스레드는 메인 스레드 이외에 동시에 작업을 수행하기 위해 생성되는 스레드들을 일컫는다.
주로 작업을 분산하거나 병렬로 처리할 때 사용된다.
📌 직렬(Serial) vs. 동시(Concurrent)
작업을 분산처리 시킬 때, 한 개의 Thread에서만 처리하면 직렬(Serial)이고,
여러개의 Threads에서 처리하면 동시(Concurrent)이다. (단, 쓰레드 개수는 시스템이 정함)
▶️ 직렬 (Serial)
분산처리 시킨 작업을 오직 한 개의 쓰레드에서만 처리하는 것.
즉, A 쓰레드에서 4개의 작업을 분산처리 시켰는데, B 쓰레드에서만 처리하는 것.
▶️ 동시 (Concurrent)
몇 개의 쓰레드로 분산할지는 시스템이 정하지만, 시스템이 정한 여러개의 쓰레드로 분산 처리하는 것.
작업들이 각자 독립적이지만 유사한 작업들일 때 굉장히 유용하다.
(ex. 테이블뷰 셀 등을 서버에서 받아올 경우)
📌 동기(sync) vs. 비동기(async)
아래 사진처럼 task 1,2,3,4를 실행해야 하는 메소드 1과
task 5, 6을 실행해야 하는 메소드 2가 존재한다고 하자.
▶️ 동기 (Sync)
동기는 작업이 순차적으로 실행되는 것을 의미한다.
한 작업이 끝날 때까지 다음 작업이 기다리며, 작업이 순서대로 실행된다.
위 사진에서 메소드 1이 동기적(sync)으로 실행된다면,
메소드 2는 메소드 1이 완료되기 전까지 실행되지 않는다.
=> task 1, task 2, task 3 -> task 4 -> task 5 -> task 6
순으로 실행될 것이다.
[serial일 경우]
[concurrent일 경우]
▶️ 비동기 (Async)
작업이 별도의 스레드 또는 백그라운드에서 실행되며,
다른 작업을 기다리지 않고 동시에 실행된다.
콜백(callback) 또는 완료 핸들러(completion handler)를 통해 결과를 처리한다.
메소드 호출 순서대로 작업이 완료된다는 것이 보장되지 않는다.
위 사진에서 메소드 1이 비동기적(async)으로 실행된다면,
메소드 1과 메소드 2가 동시에 실행될 것이다.
[serial일 경우]
( task 1,
와 같은 순서로 실행될 것이다.task 5 ) -> task 6
-> task 2 -> task 3 -> task 4
[concurrent일 경우]
(task 1, task 2, task 3, task 5
) -> task 4 -> task 6
와 같은 순서로 실행될 것이다.
📌 DispatchQueue.global().async
DispatchQueue.global().async 메소드로 백그라운드에서 비동기 작업을 실행할 수 있다.
아래 코드는 백그라운드에서 1부터 5까지의 작업을 실행한 후,
해당 작업이 완료된 후에 메인 스레드에서 UI 업데이트를 실행한다.
// 동기적으로 실행되는 작업
DispatchQueue.global().sync { //concurrent, 동기적
print("Synchronous Task")
}
// 비동기적으로 실행되는 작업
DispatchQueue.global().async { // concurrent, 비동기적
print("Asynchronous Task")
}
// 백그라운드에서 비동기 작업 실행
DispatchQueue.global().async {
// 여기서 백그라운드에서 실행될 작업을 수행합니다.
for i in 1...5 {
print("Background Task \(i)")
}
// 작업이 완료되었음을 메인 스레드로 알립니다.
DispatchQueue.main.async { // main에는 sync를 쓰면 안 됨 - deadlock때문(1번이 1번에게 일 시키는동안 멈춤... 무한 멈춤)
print("Background Task Completed, Updating UI")
// UI 업데이트 등을 수행할 수 있습니다.
}
}
/* 프린트 결과
Synchronous Task
Asynchronous Task
Background Task 1
Background Task 2
Background Task 3
Background Task 4
Background Task 5
Background Task Completed, Updating UI */