방프리

24.01.12 Chapter3. 태스크 기반 비동기 프로그래밍 (Item 30) 본문

C#/More Effective C#

24.01.12 Chapter3. 태스크 기반 비동기 프로그래밍 (Item 30)

방프리 2024. 1. 12. 01:03

Item 30 : 비동기 메서드를 사용해서 스레드 생성과 콘텍스트 전환을 피하라

 

비동기 메서드는 만능이 아니다. 로직의 수행 시간이 길면 그만큼 결과 도출이 늦어지기 때문에
비동기 메서드를 사용했다고 해서 복잡한 로직이 빠르게 수행된다는 생각을 가지면 안된다.

또한 잘 못된 생각으로 비동기 메서드에서 스레드를 생성하거나 다른 스레드로 콘텍스트를 전환한다고 해서
성능이 더 좋아지는 것도 아니다.

상황 별로 나누어보자

1. 파일 입출력은 비동기이지만 스레드가 아닌 I/O 완료 포트를 사용
2. 웹 요청도 비동기이지만 스레드가 아닌 네트워크 인터럽트 사용
3. GUI 어플리케이션은 UI 스레드가 메인 스레드이므로 다른 스레드에게 CPU 작업을 요청할 수 있음
(단, 실제로 적용하게 된다면 CPU 작업이 완료되기까지 UI 스레드는 단순 프로그레스바 표현이 끝일 수 있음)
4. 콘솔 어플리케이션은 상황에 따라 다른데 CPU 중심 태스크 하나를 장시간 수행하는 콘솔이면 스레드에 작업을
분할 위임해도 크게 의미는 없음. 대신 CPU 중심 작업을 여러 개 실행하는 경우에는 분할 위임이 큰 효과가 있음
(예로 PLINQ가 있음)
5. ASP.NET 서버 어플리케이션은 로직에 따라 다름. 하지만 쓸데없이 콘텍스트를 스위칭 하는 경우가 발생
6. 웹 요청은 주로 대기가 큰 작업을 다른 머신에게 맡겨두고 결과를 받아서 처리하는 경우가 많음.
즉, CPU 활용이 큰 작업은 다른 프로세스 또는 머신에 맡겨두고 자기 자신은 다른 일처리를 진행하는 것

비동기 메서드는 단순히 작업을 다른 리소스에 위힘하고, 해당 작업이 끝나면 결과를 받아오는 역할만 한다.
절대 수행시간이 긴 로직을 자동으로 최적화를 해주거나 병렬로 동작시키는 것이 아니기에 사용에 주의해야 한다.

Comments