[Python]비동기 라이브러리Asyncio

Jimin_Note·2022년 7월 30일
0

[Python]

목록 보기
31/34
post-thumbnail

🌟 Asyncio

대규모 병행성 작업을 위한 비동기 프로그래밍
즉, 단일 프로그램에서 동시에 여러 개의 HTTP요청을 병행하여 실행할 수 있다.
대기를 필요로 하는 여러 개의 작업을 동시에 수행할 수 있다.
작업 A가 완료되길 기다리는 동안 작업 B를 수행할 수 있도록 한다.

Asyncio로 해결할 수 있는 것

I/O 위주 작업에 스레드 기반 병행 처리보다 비동기(asynchronous)기반 병행 처리를 적용해야 하는 두가지 이유

  • Asyncio는 스레드를 사용하는 선점형 멀티태스킹보다 안전한 대안이 될 수 있다.
    스레드 기반 애플리케이션에서 때때로 발생하는 오류, 경합 조건, 혹은 비결정론적 위험요소가 발생하지 않는다.
  • Asyncio를 통해 동시에 수천 개의 소켓 연결을 간단히 처리할 수 있다.
    또한 웹소켓이나 사물인터넷을 위한 MQTT같은 신기술에서 지원하는 수명이 긴 연결도 처리할 수 있다.

네트워크 프로그래밍의 중요한 특징
어떤 일들이 일어나기를 기다리고있는 많은 작업들로 구성

Asyncio에 대한 잘못된 정보

Asyncio로 코드가 엄청나게 빨라진다?

Nope!
스레딩 방식이 비동기 방식보다 약간 더 빠르다.
물론 병행성의 규모를 지표로 삼는다면 Asyncio를 통해 병행 소켓연결을 더 쉽고 훨씬 많이 만들 수는 있다.
보통 운영체제에는 만들 수 있는 스레드 개수가 제한되어 있고, 제한 수치는 만들 수 있는 소켓 연결 개수의 제한보다 현저히 적다. 스레드 개수에 대한 제한을 변경할 수도 있지만 Asyncio를 쓰는 편이 훨씬 쉽다. 하지만 속도가 장점은 아니라는 것. 속도가 중요하다면 Cython을 쓰자!

사이썬(Cython)은 CPython 확장 모듈을 손쉽게 생성하도록 고안된 컴파일 언어이다. 파이썬 문법을 기반으로 C/C++ 루틴을 호출을 위한 외부 함수 인터페이스와 실행 속도 향상을 위한 정적 형 지정 등이 추가된 형태를 하고 있다. 이러한 특징은 파이썬의 빠른 생산성을 유지하면서도 외부 C 라이브러리와 간결하게 연동하거나 실행 속도 향상 할 수 있도록 해준다. -위키백과-

Asyncio를 쓰면 스래딩은 필요 없다?

Nope
스레딩의 진정한 가치는 여러 계산 작업들 간 메모리 공유를 할 수 있는 다중 CPU 프로그래밍이 가능하다는 점
수치 라이브러리numpy는 모든 메모리를 공유하면서 여러 CPU를 사용하여 행렬 연산을 가속한다. 온전히 성능만을 고려한다면 CPU 위주의 연산에서 스레딩과 경쟁할 만한 프로그래밍 모델은 없다.

Asyncio를 통해 GIL로 인한 문제를 제거한다?

GIL(global-전역 interpreter lock) : 각 명령 코드의 수행을 lock으로 처리하여 파이썬 인터프리터 코드를 thread-safe 상태로 보호한다. 즉, 파이썬 인터프리터가 한 스레드만 하나의 바이트코드를 실행 시킬 수 있도록 해주는 Lock
이로 인한 문제로는 인터프리터를 하나의 CPU에서만 실행하도록 강제하는 불행한 부작용이 발생하고, 멀티코어 병렬화(mulitcore parallelism)를 할 수 없다는 점이 있다.

Nope!
Asyncio가 GIL의 영향을 받지 않는 다는 것은 사실
하지만, GIL이 멀티스레드 프로그램에만 영향을 미치 때문에 영향을 받지 않는 것이다. Asyncio는 단일 스레드!!
그러므로 GIL로 인한 문제를 제거하는 것이 아닌 그냥 문제가 생길 부분이 없는것 !

Asyncio는 모든 경합 조건을 방지한다?

Nope!
경합 조건은 스레딩이나 이벤트 기반 프로그래밍의 사용 여부와 관계없이 병행 프로그래밍에서는 항상 발생할 수 있다.
Asyncio가 프로세스 간 공유 메모리 접근과 같은 멀티스레드 프로그램에서 일반적으로 발생하는 특정 범주의 경합 조건을 실제로 제거할 수 있다는 것은 사실이나 분산 마이크로서비스 구조에서 일반적으로 발생하는 공유 자원에 대한 프로세스 내부의 경합과 같은 다른 종류의 경합 조건을 방지하진 못한다.

https://docs.python.org/ko/3/library/asyncio.html

profile
Hello. I'm jimin:)

0개의 댓글