iOS 개발 기록

Swift - 동기와 비동기(sync, async), 직렬과 동시(serial, concurrent) 본문

Swift

Swift - 동기와 비동기(sync, async), 직렬과 동시(serial, concurrent)

택꽁이 2022. 7. 21. 18:19
728x90

개발자 채용 공고를 보면 조건 항목에 비동기 프로그래밍에 대한 이해와 경험 등 비동기 프로그래밍에 대한 내용을 쉽게 찾아볼 수 있다.

그만큼 개발자에게 중요한 항목인 것을 알 수 있는데, 오늘은 간단히 요걸 정리해보려고 한다! 

 

 

동기(Sync) vs 비동기(Async)

대학생 때 팀플하던 것을 생각해보자! 

일을 한명이 몰빵해서 처리할 수도 있고, 팀원들에게 각각 분배되어 진행할 수도 있다. 

한 명이 몰빵해서 할 경우, 사전 조사부터 발표 자료까지 전부 만들어야 한다.

해당 일을 마치기 전에 다음 일을 시작하는 것은 몸이 여러개가 아닌 이상 불가능하다. 

때문에 당연히 후자가 모두에게 좋은 효율적인 방법일것이다! 

 

보통 작업은 태크스(Task), 작업을 처리하는 주체를 쓰레드(Thread)라 보통 표현한다.

동기와 비동기는 작업을 어떻게 처리할 것인가에 대한 개념이다.

 

iOS에서는 Queue에 던져주면 OS차원에서 작업들을 알아서 쓰레드로 던져준다! 

그 대표적인 방법 중 하나가  GCD(Grand Central Dispatch)를 이용하는 것인데 하는데, 

GCD의 대표적인 예가 DispatchQueue다. 

 

동기와 비동기는, Queue로 작업을 요청하는 시점에서의 이야기이다. 

 

DispatchQueue.global().sync{ 
	// 작업할 task code
}

- 동기(Sync) : 작업을 쓰레드로 보내고, 쓰레드에서 그 작업이 완료 되어야 다음 작업을 시작할 수 있다.

해당 작업이 끝나지 않았다면 다음 작업을 진행할 수 없고 끝날 때까지 대기해야 한다. 

많이들 작업의 요청과 결과가 동시에 이루어진다고 표현하는데, 내가 이해한 개념으로는 동시라는게 즉시라는 표현이 아니다. 

요청하고 완료될 때 가지 아무 작업도 할수 없이 이 작업만 하기 때문에 이런 표현이 붙은게 아닐까 싶다.

 

DispatchQueue.global().async { 
	// 작업할 task code
}

- 비동기(async) : 작업을 쓰레드로 보내고, 그 작업의 완료 여부와 상관 없이 바로 다음 작업을 시작한다.

해당 작업이 끝나지 않더라도 다른 작업에 대해 수행할 수 있다! 

 

일반적으로 비동기 작업이 시간이 절약되므로 효율적이다.

그러나 작업이 끝나는 시간을 예측하기는 어렵다. (이 비동기 이벤트처리를 다루기 위해 Rx, Combine이 쓰인다! )

서버와의 통신과 같은 네트워크와 관련된 시간이 많이 드는 작업들은 대부분 비동기적으로 처리되어있다. 

 

 

 

 

 

직렬(serial)과 동시(concurrent)

위에서 동기와 비동기 형식에 따라 작업을 Queue로 던져주면 OS가 알아서 작업을 쓰레드로 던져준다고 언급했다.

직렬과 동시는 Queue로 요청받은 작업을 어떤 식으로 쓰레드에 던져줄지에 대한 내용이다. 

 

SerialQueue.async { 
 	//작업할 task code
}

- 직렬(serial) : 분산하여 보낸 작업을 하나의 쓰레드에만 보내 처리시킨다. 

 

 

ConcurrentQueue.async { 
		//작업할 task code
}

- 동시(concurrent) : 분산하여 보낸 작업을 여러개의 쓰레드로 보내 처리시킨다.

 

 

 

 

즉, 동기와 비동기 / 직렬과 동시 는 서로 별개의 개념이다. 

 

직렬(Serial) : 순서가 중요한 작업을 처리할 때 사용 

동시(Concurrent) : 독립적이지만 유사한 여러개의 작업을 처리할 때 사용

 

동기(sync) - 작업을 GCD로 던진 후 끝날때까지 기다리다가 다음 작업을 진행

비동기(async) - 작업을 GCD로 던진 후 완료 상관 없이 다음 작업을 진행

 

 

 

 

 

'Swift' 카테고리의 다른 글

[Swift] Property wrapper  (0) 2023.02.06
에러 처리  (0) 2022.10.24
Swift - 옵셔널 (Optional)  (0) 2022.07.19
Swift - 고차함수 (map, filter, reduce)  (0) 2022.07.18
[iOS] PencilKit  (0) 2022.07.07