Asynchronous Python and Databases
• Asynchronous Python and Databases - Mike Bayer
• http://bit.ly/1Ff6EJ1
Synchronous I/O in Web Server
• 쓰레드 : 클라이언트 = 1:1
• 코드가 간결, 확장하기 쉬움
• 라이브러리들이 모두 thread-safe 해야함
Slow Client Problem
해결책 : Buffering Reverse Proxy
Async I/O in Web server
• 많은 량의 I/O를 처리
• 라이브러리들이 모두 Async여야 함
• CPU intensive한 작업에 약함
Async I/O in Web Service
• 예상 - evented I/O 가 thread 모델보다 빠를 것이다
• I/O intensive한 프로그램이기 때문 (DB, 캐시 조회)
• 근데 안빠르다…
• 대체 왜?
Async I/O in Web Service
Mike Bayer의 대답
(1) Python is very slow compared to your database
I/O Bound
• 데이터를 요청하는 시간이 처리하는 시간보다 긴 작업
• 흔한 착각- 웹 어플리케이션은 데이터베이스 요청이 대부분의 시간을 차지한다
• C나 자바에서는 맞는 말
• 파이썬에선 처리하는 시간도 요청하는 시간 못지 않게 오래 걸린다. (파이썬 자체가 DB에 비해 느림)
• 얼마나 차이가 날까?
얼마나 차이가 난다고…
• MySQL-Python (C) vs PyMySQL (Python)
로컬 연결
네트워크 연결
PyMySQL benchmark (로컬)
PyMySQL benchmark (네트워크)
• I/O bound라고 하기 힘듬
• 실제 어플리케이션에선 더욱더…
요약하자면…• Async I/O 의 효과를 보려면 I/O bound여야 함
• 파이썬 어플리케이션 : I/O < 파이썬 자체의 오버헤드
• Async로 얻을 수 있는 효과를 감소시킴 (암달의 법칙)
(2) AsyncIO uses appealing, but relatively inefficient Python paradigms
yield Overhead
• 보통의 sync함수
• async 버전
benchmark
• 120 threads / processes / connection
• Local Postgresql
3. yield from …
• explicit context switching
3. yield from …• 명시적인 컨텍스트 전환이 필요한가? - no
• 왜냐하면 데이터베이스 중심 서비스는 대부분 트랜잭션을 중심으로 흘러가기 때문
3. yield from …맞는 코드:
sync를 쓰든 async를 쓰든 로직상엔 큰 차이가 없음
결론
• Async I/O를 쓰지 말라는 것은 아님
• 하지만 데이터베이스 로직에는 굳이 쓸 이유가 없음- 성능을 향상시키기보다 떨어뜨릴 확률이 높음
• Async가 적절한 상황에 nginx + uwsgi 사용