대규모 병행성 작업을 위한 비동기 프로그래밍
즉, 단일 프로그램에서 동시에 여러 개의 HTTP요청을 병행하여 실행할 수 있다.
대기를 필요로 하는 여러 개의 작업을 동시에 수행할 수 있다.
작업 A가 완료되길 기다리는 동안 작업 B를 수행할 수 있도록 한다.
I/O 위주 작업에 스레드 기반 병행 처리보다 비동기(asynchronous)기반 병행 처리를 적용해야 하는 두가지 이유
네트워크 프로그래밍의 중요한 특징
어떤 일들이 일어나기를 기다리고있는 많은 작업들로 구성
Nope!
스레딩 방식이 비동기 방식보다 약간 더 빠르다.
물론 병행성의 규모를 지표로 삼는다면 Asyncio를 통해 병행 소켓연결을 더 쉽고 훨씬 많이 만들 수는 있다.
보통 운영체제에는 만들 수 있는 스레드 개수가 제한되어 있고, 제한 수치는 만들 수 있는 소켓 연결 개수의 제한보다 현저히 적다. 스레드 개수에 대한 제한을 변경할 수도 있지만 Asyncio를 쓰는 편이 훨씬 쉽다. 하지만 속도가 장점은 아니라는 것. 속도가 중요하다면 Cython을 쓰자!
사이썬(Cython)은 CPython 확장 모듈을 손쉽게 생성하도록 고안된 컴파일 언어이다. 파이썬 문법을 기반으로 C/C++ 루틴을 호출을 위한 외부 함수 인터페이스와 실행 속도 향상을 위한 정적 형 지정 등이 추가된 형태를 하고 있다. 이러한 특징은 파이썬의 빠른 생산성을 유지하면서도 외부 C 라이브러리와 간결하게 연동하거나 실행 속도 향상 할 수 있도록 해준다. -위키백과-
Nope
스레딩의 진정한 가치는 여러 계산 작업들 간 메모리 공유를 할 수 있는 다중 CPU 프로그래밍이 가능하다는 점
수치 라이브러리numpy는 모든 메모리를 공유하면서 여러 CPU를 사용하여 행렬 연산을 가속한다. 온전히 성능만을 고려한다면 CPU 위주의 연산에서 스레딩과 경쟁할 만한 프로그래밍 모델은 없다.
GIL(global-전역 interpreter lock) : 각 명령 코드의 수행을 lock으로 처리하여 파이썬 인터프리터 코드를 thread-safe 상태로 보호한다. 즉, 파이썬 인터프리터가 한 스레드만 하나의 바이트코드를 실행 시킬 수 있도록 해주는 Lock
이로 인한 문제로는 인터프리터를 하나의 CPU에서만 실행하도록 강제하는 불행한 부작용이 발생하고, 멀티코어 병렬화(mulitcore parallelism)를 할 수 없다는 점이 있다.
Nope!
Asyncio가 GIL의 영향을 받지 않는 다는 것은 사실
하지만, GIL이 멀티스레드 프로그램에만 영향을 미치 때문에 영향을 받지 않는 것이다. Asyncio는 단일 스레드!!
그러므로 GIL로 인한 문제를 제거하는 것이 아닌 그냥 문제가 생길 부분이 없는것 !
Nope!
경합 조건은 스레딩이나 이벤트 기반 프로그래밍의 사용 여부와 관계없이 병행 프로그래밍에서는 항상 발생할 수 있다.
Asyncio가 프로세스 간 공유 메모리 접근과 같은 멀티스레드 프로그램에서 일반적으로 발생하는 특정 범주의 경합 조건을 실제로 제거할 수 있다는 것은 사실이나 분산 마이크로서비스 구조에서 일반적으로 발생하는 공유 자원에 대한 프로세스 내부의 경합과 같은 다른 종류의 경합 조건을 방지하진 못한다.