asynchronous python and database

25
Asynchronous Python and Databases

Upload: daehee-han

Post on 17-Jul-2015

168 views

Category:

Software


0 download

TRANSCRIPT

Asynchronous Python and Databases

• Asynchronous Python and Databases - Mike Bayer

• http://bit.ly/1Ff6EJ1

Sync vs Async

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

benchmark

• 120 threads / processes / connection

• Local Postgresql

3. yield from …

3. yield from …

• explicit context switching

3. yield from …• 명시적인 컨텍스트 전환이 필요한가? - no

• 왜냐하면 데이터베이스 중심 서비스는 대부분 트랜잭션을 중심으로 흘러가기 때문

3. yield from …맞는 코드:

sync를 쓰든 async를 쓰든 로직상엔 큰 차이가 없음

결론

• Async I/O를 쓰지 말라는 것은 아님

• 하지만 데이터베이스 로직에는 굳이 쓸 이유가 없음- 성능을 향상시키기보다 떨어뜨릴 확률이 높음

• Async가 적절한 상황에 nginx + uwsgi 사용