Aysncio 란
-
Asynio로 무엇을 할 수 있는가에 대한 질문으로는 간단하게 단일 프로그램에서 동시에 여러개의 HTTP 요청을 병행하여 실행할 수 있다는 것이다.
-
결론부터 이야기하지면 Asyncio의 목표는 대기를 필요로 하는 여러 개의 작업을 동시에 잘 수행하는 것이다. 따라서 이 작업이 완료되기를 기대라는 동안 다른 작업을 수행할 수 있도록 하는 것이다.
Asyncio로 해결할 수 있는 것
-
I/O 위주 작업에 스레드 기반 병행 처리보다 비동기 기반 병행 처리를 적용하는 것이 낫다.
-
Asyncio는 스레드를 사용하는 선점형 멀티 태스킹보다 안전한 대안이 될 수 있다. 단순하지 않은 스레드 기반 애플리케이션에서 때때로 발생하는 오류, 경합 조건, 혹은 비결정론적 위험 요소가 발생하지 않는다.
-
Asyncio를 통해서 동시에 수천개의 소켓 연결을 간단히 처리할 수 있다. 또한 웹 소켓이나 사물 인터넷을 위한 MQTT 같은 신기술에서 지원하는 수명이 긴 연결도 처리할 수 있다.
-
프로그래밍 모델 관점에서 보면, 스레딩의 여러 CPU와 공유 메모리 (스레드 간 효율적인 통신의 수단)을 사용하는 방식이 계산 위주의 작업을 가장 잘 수행할 수 있어서 계산 위주의 작업이 많은 분야에 적합하지만 다른 문제점을 발생시킬 수도 있어서 필요악이다.
-
반면에 네트워크 프로그래밍은 ‘어떤 일들이 일어나기를 기다림’이라는 많은 작업들로 구성되어있다. 따라서 여러 CPU에 작업을 효율적으로 분배하기 위한 운영체제와의 연계작업이 필요없다.
-
또한 공유 메모리 접근 시 발생할 수 있는 경합 조건과 같은 리스크를 불러오는 선점형 멀티 태스킹도 필요없다.
스레딩의 장점
- 공유 메모리를 통한 병렬 처리
- 노하우 및 기존 코드 활용
스레딩의 단점
-
스레드 관련 오류나 경합 조건을 고치기 어렵다.
-
스레드는 자원을 많이 소모한다.
-
스레드는 유연하지 않다.
-
선점형 멀티 태스킹의 문제는 단계를 실행중인 스레드가 언제든지 중단된 후에 다른 스레드에서 해당 단계를 실행할 수 있다는 점이다.
-
락을 걸어서, 해결할 수 있지만, 이 방법을 적용하기 위해서는 스레드 간에 공유되는 상태 값이 쓰이는 모든 위치를 파악해야 한다.
-
모든 소스 코드를 통제하는 경우라면 가능할지 모르겠으나 서드파티 라이브러리를 사용하는 경우에는 매우 적용하기 어렵다.
-
소스 코드만 확인해서는 경합 조건을 찾아내기 힘들고 OS는 거의 모든 곳에서 스레드 간의 콘텍스트 전환을 할 수 있다.
-
하지만 비동기 프로그램에서는 여러 병행 코루틴 간에 콘텍스트 전환이 정확히 언제 발생하는지 학인할 수 있다.