Concurrency(동시성)프로그래밍에 대해서3 (동기와 비동기의 차이)

2021. 11. 29. 22:00iOS/iOS

728x90
반응형
 
이 포스팅은 인프런의 동시성 프로그래밍 강의를 참고하여 제작하였습니다.

 

안녕하세요 bannavi입니다^ㅅ^

지난 시간에 이어지는 포스팅입니다.

 

 

 

동기(Sync) VS 비동기(Async)

 

 

지금까지 작업을 대기열로 보낼 수 있다고 했죠?

1번 스레드에서 하는 작업을 이렇게 Queue(대기열)로 보내주고, 또 대기열에서 다른 스레드로 task를 보내주는거였죠.

아래의 그림은 작업을 보낸 시점을 기준으로 표시해주고 있습니다. 그리고 바로 리턴! 하는것이 비동기의 개념입니다.

작업이 완료되는걸 안기다리고! 바로 돌아온다는거에요. 마치 무궁화꽃이처럼.. 치고빠지는 녀석이 비동기라고 볼 수 있겠네염

 

 

 

이렇게 되면 task1이 다른 스레드로 보내졌으므로 하나씩 task들을 앞당겨서 또 처리할 수 있겠죠?

음 근데 작업을 처리하는 시간 자체가 오래걸린다고 가정했을때, 이 task가 작업이 끝났는지에 대해 관심이 없다면 

진짜 훨~~~씬 작업이 빨라지겠죠.

 

메인스레드에서 하던 일을 다른 스레드에서시작시키고, 작업이 끝날때까지 안기다린다.

=> 메인스레드가 다른 일 처리를 시작할 수 있다.

 

이것이 바로 비동기 처리의 핵심입니다.

 

 

코드로 한번 볼까요?

원래의 작업이 진행되고 있던 메인스레드에서 디스패치글로벌 큐로 보낸 task(블록안의 코드)를?

안기다린다.(async는 비동기)

 

이게 바로 비동기의 핵심!

 


 

자 이제 동기 개념에 대해서 살펴볼까요?

 

 

이번에도 마찬가지에요!

queue로 작업을 보내놓고 iOS가 큐에 있는 task를 스레드로 옮겨놓겠죠.

근데 이젠 이 작업이 끝날때까지 어떻게한다?

 

기다린다.

 

비겁하다... 메인스레드에 있는 다른 task들은 이 task1의 작업이 완료될때까지 기다려야하네요....ㅠㅠ

웃기는 동기녀석이네. 얘땜에 task2, task3, task4는 일을 시작도 못하고 있어요

 

동기에 대해서 다시 정리하겠습니다.

작업을 시작시키고, 뿐만 아니라 작업이 끝날때까지 기다린다.

 

 

코드로도 봐보겠습니다.

 

이번엔 async가 아니라 sync네요.

 

원래 작업이 진행되고 있던 1번 스레드에서 dispatch global queue로 보낸 작업을 동기적으로 기다린다.

보낸작업이 끝날때까지 난 무줘건! 기다릴거야~ 요런 의미가 되겠네요.

 

 

아니 잠깐만. 그러면 이렇게 2번 스레드로 보내는게 의미가 있을까요? 의미가 없을 수도 있겠죠? 어차피 기다려야하는건 똑같은데ㅋㅋ

 

그래요. 동기적으로 보내는 코드를 짜더라도 실질적으로는 동기는 메인스레드에서 일을 합니다.

 

 

그래서 비동기를 배우는 대부분의 단원에서 대부분의 코드는 sync가 아닌 async를 사용합니다.

기존에 오래 걸리던 작업을 다른 스레드로 보내고 싶은거고, 다른 스레드로 보낸 작업을 기다리지 않고 일들을 하고 싶은거죠.

솔직히 저같아도 아직 동기의 필요성을 크게 못느끼겠어요.

 

이 동기(sync)가 필요한 부분은 뒤에서 자세히 다루도록 할게요!

 

 

정리하겠습니다.

 

비동기(Async) - 작업을 다른 스레드에서 하도록 시킨 후, 그 작업이 끝나길 안기다리고 다음일을 진행한다.

(안기다려도 다음 작업을 생성 가능)

 

동기(Sync) - 작업을 다른 스레드에서 하도록 시킨 후, 그 작업이 끝나길 기다렸다가 다음일을 진행한다.

(기다렸다가 다음 작업을 생성 가능)

 

 

 

 

비동기 개념이 일반적으로 필요한 이유는?

 

대부분 서버와의 통신(네트워크 작업)때문이라고 할 수 있습니다.

네트워크와 관련된 작업들은 내부적으로 비동기적으로 구현하기 때문입니다.

 

예를들면 아래와 같은 URLSession이지요.

이 URLSession은 내부적으로 비동기처리가 되어있기 때문에 이 URLSession을 사용하고 있다면?

내부적으로 알아서 다른 스레드에서 일을 하고 있구나~ 라고 생각해주셔도 됩니다.

 

 

오호... 흥미돋네요. URLSession!

뭔가 아는 개념이 나와서 더 반가운것같아요! ㅋㅋㅋ

 

그럼 다음 시간에는 직렬(Serial)과 동시(Concurrent)의 차이에 대해서 배워보도록 할게용!

 

 

 

 

reference

728x90
반응형