(Swift-[Concurrency]) 동시성
안녕하세요! 오늘 정리할 내용 Concurrenc(동시성) 입니다~!!
Concurrency(동시성) 은 프로그래밍에서 중요하니 딱! 정리하고 싶어져 포스트 합니다.!
일단 Concurrency(동시성)은 대부분 생소하실수도 있으니 어떤건지 한번 알아볼까요.
Concurrency(동시성) 이란 쉽게 이야기해서!
프로그램이 실행되었을때 Task(작업) 을 나누어 실행하는 개념
무슨 말인지 조금 이해가 안가시나요? ㅎㅎ
아래의 사진을 한번 봐주세요!!
이건 제가 지금 개발중인 프로젝트의 CPU 부분 이에요.
밑에 자세히 보시면 여러개의 Thread 가 보이시나요?
저 Thread 들이 일을 Task(작업)을 이행하는 친구들이라고 생각하시면 됩니다.
Thread는 그럼 정확히 무엇인가!
PC 사양에 코어(Core)라는 단어 들어보신적 있으신가요?!
예를 들어 아이폰 12의 사양은 6코어를 가지고 있습니다 , 20년 맥프로 6코어 이런식으로여!
Core는 기기의 두뇌를 뜻하잖아요 두뇌에 있는 혈관이라고 생각하시면 될꺼 같아요
제가 알아보았을땐 코어가 몇개있으면 Thread는 몇개다! 딱 이렇게 정형화 된 자료는 아직 찾지 못했습니다..
그럼 Thread를 알아보았으니 Concurrency(동시성) 의 대해서 제대로 공부해보겠습니다.
자 이게 보통 저희가 프로그램을 실행시키면 진행되는 Thread입니다.
물론 이렇게까지 1에 모두 몰빵되어있는 경우는 많이 없지만..ㅎ
거의 모든 첫시작은 Thread 1 에서 작업이 진행이 됩니다
그렇게되면! Thread1 에서 감당하게 되는 Task가 많으니 당연히 프로그램이 버벅 거리겠지요?
작업하나가 끝나야 다음작업으로 넘어가게 되니깐요
이런 문제를 해결하는 방법이 Concurrency(동시성) 를 이용하여 Thread에 분산하여 Task를 처리해주면 됩니다.
어떤 방법으로 하는가?
Task 를 Queue(대기행렬) 에 보내주면 됩니다.
저희는 Queue(대기행렬) 를 만들어 그곳에 넣어만 놓으면
GCD , Operation 들이
알아서 Thread에 작업을 분배해 줍니다.
(iOS에만 해당하는 기능으로 알고있습니다 아닌가요??ㅎㅎ)
GCD - Grand Central Dispatch
이렇게 Thread에 배분된 Task(작업) 들은 모두 비동기 동작을 하게 됩니다.
자그럼 GCD(디스패치큐)가 Queue를 어떻게 만들게 어떻게 보내는가 에 대해서 알아보겠습니다.
DispatchQueue.global().async {
}
많이들 사용해 보셨을꺼고 아니면 소스코드에서든 많이 보셨을겁니당!
저 코드를 한번 뜯어서 보자면용!
DispatchQueue : 큐에 보낸다.
global() : 글로벌 큐 에 (여기에선 자신이 보낼 큐를 설정합니다 ex) main,global
async : 비동기 처리를 한다.
GCD는
1 . 간단한 양을 담당해야 합니다.
2. 함수형프로그래밍 작업을 담당합니다.
왜냐면 GCD는 클로져를 작업을 담당하기 때문에 그안에 이루어질수있는 작업들은 간단한편이 좋겠지요?
이런식으로 진행된다고 보시면 될꺼 같습니다.!
자 그다음
Operation
일단 Operation은 복잡한 작업을 수행시키는것이 좋습니다 .
그리고 Operation은 GCD 상위호환 버전이라고 볼수 있습니다!
취소 , 순서지정 , 일시중지 기능들도 있습니다
Operation은 예를 들어 ScrollView에서 빠른 Scroll로 인해 이미지들이 서버와의 통신에서 미처 제대로 다운되지 않아서 Placeholder Image만 보일경우 이미 지나간 이미지의 경우 다운로드를 받아야 할까? 라는 부분에서 사용하면 좋을것 같습니다. 받고싶지 않을땐 OperationQueue는
취소,일시중지가 가능하기 때문입니다.
동기(Synchronous),비동기(Asynchonous)
일단 Concurrency(동시성) 에는 동기와 비동기가 있습니다.
동기는 말그대로 데이터를 동기화 처리 하겠다 라는 말을 뜻합니다.
동기화 처리란 Thread 에서 Task(작업) 이 실행될 때
순차적으로 Task가 실행되는 것으로
예를 들어 Task1 의 작업이 시작 되면 Task2의 작업은 Task1 의 작업이 완료 될때 까지 작업하지 않고 대기 합니다.
또한 Concurrency(동시성) 이기 때문에 다른 Thread 에서 작업 중이더라도
순차적으로 실행됩니다.
제가 만든 참고이미지를 보시면
이런식으로 Task1은 Thread2 에서 작업하지만 Queue에 올라와서 분배 되기전 Thread1 에 자리에 Block이 하나 자리함으로써 대기중으로 표시되어 Task2는 실행되지 않는 것입니다.
코드를 한번 보겠습니당
DispatchQueue.global().sync {
<#code#>
}
아까 와는 다르지요 일반적으로 GCD는 비동기처리로 많이 사용하기 때문에어싱크(async)를 주로 사용하지만 동기처리는 싱크(sync)를 사용하게 됩니다.
위에서 뜯어보았던 DispatchQueue 마지막만 다른게 보이시나요? 뜯어보게되면!
DispatchQueue : 큐에 보낸다.
global() : 글로벌 큐 에 (여기에선 자신이 보낼 큐를 설정합니다 ex) main,global
sync : 동기처리한다.(작업이 끝날때까지 기다린다)
라고 설명할수 있습니다.
비동기 처리가 왜 필요한가에 대한 의문점이 생길수 있습니다.
비동기 처리는 일반적으로 서버와의 통신 때문에 필요하게 됩니다.
그리고 똑똑한 Swift는 서버와의 통신을 담당하는 내장함수에 기본적으로 비동기처리 시스템이 탑재 되어있습니다
URLSession().dataTask(with: <#T##URLRequest#>) { <#Data?#>, <#URLResponse?#>, <#Error?#> in
<#code#>
}
요런 코드 많이들 사용하시잖아요? 이런 Task , Session 같은게 붙어있는 함수들은 거의 대부분 비동기처리로 진행하게 됩니다!! 완전 편리.. ㄷㄷ
그럼 이제 Queue가 가지고 있는 특성을 한번 살펴보겠습니다!.
Serial(직렬)
Serial(직렬) 특성 은 일단 이미지로 바로 보시는게 이해될것 같습니다!
Queue가 받아들인 작업을 딱 한개의 Thread로 보내 작업을 실행시키는 특성입니다 (대기열)
Concurrency(동시)
Concurrency(동시) 특성은 다른 Thread에서 분산하여 작업을 수행하는 특성입니다.!
Serial(직렬): 순서가 중요한 작업을 할때 사용
Concurrency(동시) : 독립적이지만 유사한 여러개의 작업을 할때 사용 ex) TableViewCell에 서버에서 각 다른 Data를 넣어야할때. 등등
그래서~ 비동기 처리는 프로그래밍에서 굉장히 중요합니다!(이유는 App최적화때문이기도)
그런데 비동기처리를 제대로 하려면! Concurrency(동시성) 알아야 하고
Concurrency(동시성)를 통하여 Thread에 작업을 분배해야합니다 .!
그리고
GCD 와 Operation 둘중 어떤것을 사용해야 하는지는
일단 많은 프로젝트를 만들어보면서 효율성을 고려 해야할것 같습니다.
Author And Source
이 문제에 관하여((Swift-[Concurrency]) 동시성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@leejinseong9410/Swift-Concurrency-동시성저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)