2012-04-18 4 views
24

SQLAlchemy를 통한 데이터베이스 호출이 차단되어 동기식 코드 이외의 다른 용도로 사용하기에 부적합하다는 인상하에 있습니다. 내가 맞습니까 (내가 아니길 바래!) 아니면 비 차단으로 구성 할 수있는 방법이 있습니까?SQLAlchemy를 비 블로킹으로 구성 할 수 있습니까?

+1

짧은 대답, 아니오. 그것은 SQLalchemy 자체가 아니라 차단하고있는 데이터베이스 라이브러리입니다. 아무것도 DB에서 물건을 별도의 스레드에서,하지만 멈추지 않아. – AdamKG

+2

@AdamKG 이것은 아마도 답이 아니라 주석이어야합니다! :-) – Matty

답변

24

gevent을 사용하여 비 차단 스타일로 SQLA를 사용할 수 있습니다.

https://bitbucket.org/zzzeek/green_sqla/

나는 또한 들어 본 사람 pymysql와 같은 생각을 사용 : 여기 psycopg2의 coroutine support 사용, 예를 들어 사용 psycopg2입니다. pymysql은 순수한 Python으로 소켓 라이브러리를 사용하기 때문에 gevent는 소켓 라이브러리를 비동기 적으로 패치합니다.

+0

우수! 고맙습니다. 이 방법으로 사용할 때 (문서에 나타나지 않는)주의해야 할 사항이 있습니까? – Matty

+1

확실하지 않습니다. 풀링을 사용할 수 없게하는 NullPool을 사용하면 더 잘 작동하는 것 같았습니다. 그렇지 않으면 무언가가 멈추고있었습니다. 그러니 어쩌면 시작하는 데 신중을 기해야합니다. – zzzeek

+3

@zzzeek 사용자의 응답 중단은 猿가 아닌 패치 된 스레딩을 사용하여 SQLAlchemy의 기본 풀 (QueuePool)에서 발생할 수 있습니다. gevent 's monkey patch를 적용하거나 https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ에서 예제에 따라 QueuePool의 녹색 버전을 만드십시오. 그것은 내가 가지고있을 때 동일한 행동을 고쳤다. – CryingCyclops

6

그들이 깔끔한 비 차단 라이브러리, 특히 tornado.gen을 가지고 있으므로 Tornado을 살펴보십시오.

우리는 Momoko과 함께 토네이도 용 비 차단 psycopg wrapper lib를 사용합니다. 지금까지 정말 좋았어요. 아마도 유일한 단점은 SQLAlchemy가 제공하는 모든 모델 객체를 잃어버린다는 것입니다. 성능은 비현실적입니다.

+0

나는 토네이도를보고 있었고, 나는 그 길로 갈 수도있다. 어쩌면 내가이 테스트를위한 데모 코드를 작성해야하지만 psycopg 드라이버가 비동기 데이터베이스 호출을 지원한다면 SQLAlchemy를 사용하여 비 블로킹 DB 호출을 수행 할 수 있다고 가정합니다. – Matty

+0

@Matty 좋은 생각, 나는 당신이 그걸 어떻게 가는지 듣고 싶다. SQLAlchemy로 공격 할 수 있다고 생각하는 주요 쟁점 중 하나는 차단 호출이 언제 만들어 지는지 정확하게 알 수 없다는 것입니다. 당연히 당신은 코드에 대한 깊은 잠수를 통해 내 직감에 의해 많은 일이 언제 일어날 지 알 수 있습니다. – kuhnza

+0

@Kahunza psycopg2에 대한 문서를 살펴본 후 SQLAlchemy의'create_engine()'함수에 전달 된 연결 문자열에 포함될 수있는 인수가있는 것처럼 보입니다. 아마도 관리자 중 한 명이 차임을하거나 내가 그들의 목록에서 물어볼 것입니다. 건배! – Matty

1

greenlet의 도움이 없으면 대답은 아니오, asyncio의 맥락에서입니다.

그러나 asyncio에서 SQLAlchemy의 일부만 사용할 수 있습니다. GINO project에서 엔진 및 완전 실행 컨텍스트없이 SQLAlchemy 코어 만 사용하여 asyncio에서 간단한 ORM을 만드는 예제를 찾아보십시오.

관련 문제