SQLAlchemy를 통한 데이터베이스 호출이 차단되어 동기식 코드 이외의 다른 용도로 사용하기에 부적합하다는 인상하에 있습니다. 내가 맞습니까 (내가 아니길 바래!) 아니면 비 차단으로 구성 할 수있는 방법이 있습니까?SQLAlchemy를 비 블로킹으로 구성 할 수 있습니까?
답변
gevent을 사용하여 비 차단 스타일로 SQLA를 사용할 수 있습니다.
https://bitbucket.org/zzzeek/green_sqla/
나는 또한 들어 본 사람 pymysql와 같은 생각을 사용 : 여기 psycopg2의 coroutine support 사용, 예를 들어 사용 psycopg2입니다. pymysql은 순수한 Python으로 소켓 라이브러리를 사용하기 때문에 gevent는 소켓 라이브러리를 비동기 적으로 패치합니다.
우수! 고맙습니다. 이 방법으로 사용할 때 (문서에 나타나지 않는)주의해야 할 사항이 있습니까? – Matty
확실하지 않습니다. 풀링을 사용할 수 없게하는 NullPool을 사용하면 더 잘 작동하는 것 같았습니다. 그렇지 않으면 무언가가 멈추고있었습니다. 그러니 어쩌면 시작하는 데 신중을 기해야합니다. – zzzeek
@zzzeek 사용자의 응답 중단은 猿가 아닌 패치 된 스레딩을 사용하여 SQLAlchemy의 기본 풀 (QueuePool)에서 발생할 수 있습니다. gevent 's monkey patch를 적용하거나 https://groups.google.com/forum/#!msg/gevent/533wzrnL0Fs/ijL34u5prYIJ에서 예제에 따라 QueuePool의 녹색 버전을 만드십시오. 그것은 내가 가지고있을 때 동일한 행동을 고쳤다. – CryingCyclops
그들이 깔끔한 비 차단 라이브러리, 특히 tornado.gen을 가지고 있으므로 Tornado을 살펴보십시오.
우리는 Momoko과 함께 토네이도 용 비 차단 psycopg wrapper lib를 사용합니다. 지금까지 정말 좋았어요. 아마도 유일한 단점은 SQLAlchemy가 제공하는 모든 모델 객체를 잃어버린다는 것입니다. 성능은 비현실적입니다.
나는 토네이도를보고 있었고, 나는 그 길로 갈 수도있다. 어쩌면 내가이 테스트를위한 데모 코드를 작성해야하지만 psycopg 드라이버가 비동기 데이터베이스 호출을 지원한다면 SQLAlchemy를 사용하여 비 블로킹 DB 호출을 수행 할 수 있다고 가정합니다. – Matty
@Matty 좋은 생각, 나는 당신이 그걸 어떻게 가는지 듣고 싶다. SQLAlchemy로 공격 할 수 있다고 생각하는 주요 쟁점 중 하나는 차단 호출이 언제 만들어 지는지 정확하게 알 수 없다는 것입니다. 당연히 당신은 코드에 대한 깊은 잠수를 통해 내 직감에 의해 많은 일이 언제 일어날 지 알 수 있습니다. – kuhnza
@Kahunza psycopg2에 대한 문서를 살펴본 후 SQLAlchemy의'create_engine()'함수에 전달 된 연결 문자열에 포함될 수있는 인수가있는 것처럼 보입니다. 아마도 관리자 중 한 명이 차임을하거나 내가 그들의 목록에서 물어볼 것입니다. 건배! – Matty
greenlet의 도움이 없으면 대답은 아니오, asyncio의 맥락에서입니다.
그러나 asyncio에서 SQLAlchemy의 일부만 사용할 수 있습니다. GINO project에서 엔진 및 완전 실행 컨텍스트없이 SQLAlchemy 코어 만 사용하여 asyncio에서 간단한 ORM을 만드는 예제를 찾아보십시오.
- 1. SQLAlchemy를 사용하도록 장고 구성
- 2. Heroku에서 SQLAlchemy를 사용할 수 있습니까?
- 3. MFMailComposeViewController를 구성 할 수 있습니까?
- 4. 단일 UIPickerView에서 사용자 지정보기 구성 요소와 비 사용자 지정보기 구성 요소를 혼합 할 수 있습니까?
- 5. 라이브 바인딩을 사용하여 여러 구성 요소를 (비 구성 요소) 객체에 바인딩 할 수 있습니까?
- 6. 비 -IPod 음악을 검색 할 수 있습니까?
- 7. Spring 빈을 비 프로비저닝 할 수 있습니까?
- 8. 어떻게 비 정적에 액세스 할 수 있습니까?
- 9. 비 안정 경로 구성
- 10. SQLAlchemy를 사용하여 SQLite 데이터베이스를 메모리로 읽을 수 있습니까?
- 11. SQLAlchemy를 사용하여 postgres db 덤프를 얻을 수 있습니까?
- 12. sqlalchemy를 사용하여 인덱스 나열
- 13. cudaDeviceSynchronise가 블로킹으로 설정된 경우에도 새 스레드를 생성합니다.
- 14. WP7에서 'CameraCaptureTask'의 해상도를 구성 할 수 있습니까?
- 15. 환경 별 콘텐츠를 구성 할 수 있습니까?
- 16. WPF에서 글꼴 크기를 구성 할 수 있습니까?
- 17. 순서대로 셰이더를 구성 할 수 있습니까?
- 18. system.serviceModel 구성 섹션을 재정의 할 수 있습니까?
- 19. ELMAH를 코드로 완전히 구성 할 수 있습니까?
- 20. nowjs를 어떻게 구성 할 수 있습니까?
- 21. Restlet이 BufferedHttpEntity를 사용하도록 구성 할 수 있습니까?
- 22. FactoryGirl에서 "일회성"팩토리를 구성 할 수 있습니까?
- 23. wordpress를 touristic portal로 구성 할 수 있습니까?
- 24. 어떻게 유한 오토마타를 구성 할 수 있습니까
- 25. oracle은 삽입을 캐시하도록 구성 할 수 있습니까?
- 26. asp.net mvc에서 어떻게 구성 할 수 있습니까?
- 27. gsoap : 어떻게 구성 할 수 있습니까?
- 28. .h 파일 생성을 구성 할 수 있습니까?
- 29. 런타임시 NHibernate를 구성 할 수 있습니까?
- 30. Maven의 소스 위치를 구성 할 수 있습니까?
짧은 대답, 아니오. 그것은 SQLalchemy 자체가 아니라 차단하고있는 데이터베이스 라이브러리입니다. 아무것도 DB에서 물건을 별도의 스레드에서,하지만 멈추지 않아. – AdamKG
@AdamKG 이것은 아마도 답이 아니라 주석이어야합니다! :-) – Matty