비동기 프로그래밍이란?
CPU를 더욱 효율적으로 사용하기 위한 기술이다.
중앙처리장치는 많은 작업을 요청받고 처리한다. 네트워크 통신을 주고 받거나, 데이터를 읽고 쓰는 등 많은 작업을 매초마다 처리하게 되는데, 이를 현재 입출력 작업이 완료되길 기다리게 하는것은 비효율적이다. 이를 해결하기 위해 비동기 프로그래밍을 사용하며, 입출력을 기다리는 대신, 다른 업무를 처리하게 하며 입출력 작업이 완료되었다는 메세지를 받은뒤 기존 작업을 이어나가는 프로그래밍이다.
그러니, 우리가 비동기 프로그래밍을 사용할때, 쉽게 말해 오래 걸릴것 같은 함수들에 대해서는 비동기로 돌리자는 것이다.
오래 실행되는 함수를 그냥 동기적으로 작성하고, 필요하면 새 스레드나 작업 객체에서 그런 함수를 호출함으로써 동시성을 도입하는 전통적인 접근방식과 대조적이라고 한다.
동기 vs 비동기
한 식당을 예를 들어보자
사장이 있고, 직원(쓰레드)가 있고, 주문(작업)이 들어오며, 주문을 요리하는 과정을 하나의 flow라고 생각하자.
1) 싱글 쓰레드의 경우 - 직원 1명
동기 - 주문이 들어왔다. 손님은 김밥과 라면을 시켰다. 직원이 김밥을 말고, 다 말고 나서, 라면을 끓이기 시작했고, 라면이 다되어 손님에게 가져다 주었다.
비동기 - 직원은 라면의 물을 끓이면서, 동시에 김밥을 말기 시작했다. 김밥이 다되어갈때, 물이 끓는다. 라면과 수프를 넣고, 김밥을 마무리하고, 라면을 마무리한다.
비동기와 멀티 쓰레딩이 헷갈린다. 그러니 멀티 쓰레드인 경우를 살펴보자
2) 멀티 쓰레드의 경우 - 직원 n명 (김밥을 마는 직원, 라면을 끓이는 직원, 서빙하는 직원)
동기 - 주문이 많이 들어왔다. 10개 만큼 들어왔다고 해보자. 김밥을 1개 말고, 다음 김밥을 말기 시작한다. 라면도 동일하다.
비동기 - 김을 동시에 10개를 깔고, 밥을 10개를 한번에 깔고..라면도 동일하게 10개를 동시에 준비한다.
-> 차이는 동기식 처리방식의 flow가 많이 소요된다는 것을 알수가 있다. 같은 작업을 처리할때, 소모되는 시간의 차이 또한 명백히 상상할수가 있다.
용도
프로그래밍을 하다보면, 큰 메서드를 더 작은 메서드들로 리팩터링하는 경우가 있다, 그러면 메서드들이 메서드들을 연쇄적으로 호출하는 '메서드들의 사슬'들이 생겨난다. 그런 사슬들은 하나의 호출 그래프를 형성한다. - (애니메이션의 state끼리의 연결 노드를 상상해보면 된다)
전통적인동기적접근방식에서는, 호출 그래프에 오래 실행되는 메소드가 껴있는 경우 UI의 반응성을 보장(서비스 이용중 하나의 작업을 기다리고, 다음 작업으로 넘어가게 되면, 불편하지 않겠는가)하려면 호출 그래프 전체를 스레드에서 실행해야 한다. 결과적으로 하나의 동시적 연산에 다수의 메서드들이 관여하게 되며(성긴 동시성), 프로그래머는 호출 그래프의 모든 메서드에 대해 스레드 안전성을 고려해야 한다.
( 즉, 둘 이상의 쓰레드가 서로 공유하는 데이터를 사용할 때는 주어진 시간에 오직 하나의 쓰레드만 접근 가능하게 하여 각각의 쓰레드가 오동작하지 않도록 하는 것)
그러나 비동기적 접근방식에서는 호출 그래프 전체를 스레드에서 실행할 필요가 없다. 그럴 필요가 있는 메서드에 대해서만 스레드를 띄우면 된다. 다른 모든 메서드는 모두 UI 스레드에서 실행할 수 있으며, 따라서 스레드 안전성이 훨씬 간단해진다. 이런 접근방식은 세밀한 동시성, 즉 작은 동시적 연산들로 이루어지며 그 실행이 UI 스레드와 개별 스레드를 오가는 형태의 동시성으로 이어진다.
-> 이로 인한 문제
서로 다른 스레드가 같은 자원을 경쟁해서 사용하는 현상은 드물지 않은 현상이다. 그리고 이러한 경쟁 상태를 효과적으로 대처하지 않는다면 교착 상태에 빠지거나 원하지 않는 형태로 동작할 수도 있다. - Cross Thread Exception
C#에는 asnyc-await로 구현할수 있는데 이는 다음에 예제와 함께, 올리도록 하겠다.
참고) https://www.notion.so/makecoding/C-async-await-1-833c1a16f76546afb13dd4e6c7156d65
'Programming > C#' 카테고리의 다른 글
Effective C# - 캐스트보다 is, as를 사용하자 (0) | 2022.08.29 |
---|---|
C# - 프로퍼티(Property) (0) | 2022.07.24 |
C#- 비동기 프로그래밍(2) with 예제 (0) | 2022.06.12 |
C# - 구조체(struct) (0) | 2022.05.23 |
C# - 델리게이트와 이벤트/ Delegate & Event (0) | 2022.05.14 |