2012-07-16 3 views
5

간단한 통계를 저장하기 위해 Django의 views.py에서 간단한 MongoDB 연결을 사용하기 위해 db = pymongo.Connection() 전화를했습니다.장고 + PyMongo 풀링 모범 사례?

MongoDB 연결 풀링을 자동으로 지원하는 가장 좋은 방법은 무엇입니까?

end_request() 코드는 어디에 넣어야합니까?

연결 중에 max_pool_size 매개 변수를 어떻게 선택합니까?

답변

7

How does connection pooling work in PyMongo?

모든 연결 인스턴스가 내장되어 연결 풀링. 기본적으로 각 스레드는 첫 번째 작업에서 예약 된 자체 소켓을 가져옵니다. 그 소켓은 해당 스레드가 end_request()를 호출 할 때까지 보관됩니다.

end_request()를 호출하면 소켓을 풀에 반환하고 새 소켓을 만드는 대신 다른 스레드에서 사용할 수 있습니다. 스레드가 많은 응용 프로그램 또는 PyMongo 작업을 거의 호출하지 않는 스레드가 실행 시간이 긴 응용 프로그램에서는이 방법을 유용하게 사용하는 것이 중요합니다.

또는 auto_start_request = False로 작성된 Connection은 이 모든 스레드간에 (안전하게) 소켓을 공유합니다.

내 생각에는 응용 프로그램 유형과 연결 요청 시간이 달라질 것입니다. end_request을 호출하는 아이디어는 오랫동안 소켓을 잡고 요청을 생성하여 많은 소켓을 생성하는 데 도움이됩니다. 단일 요청이 더 이상 필요하지 않을 때 연결을 해제 할 수 있으면 소켓은 다른 요청을 위해 용도 변경 될 수 있습니다.

빠른 요청 인 경우 소켓을 다시 사용하여 auto_start_request=False이 작동한다고 생각합니다.

연결이 동일한 소켓을 계속 사용한다는 것은 일관성있는 읽기를 의미합니다. 쿼리를 만들었지 만 지연되고 나서 다른 쿼리를 즉시 만들어 다른 소켓을 사용했다면 생각해보십시오. 이 소켓은 이전보다 먼저 응답합니다. 이전 쓰기를 반영하지 않으므로 일치하지 않는 데이터가 있습니다.

+0

안녕하세요, @jdi, 대답 주셔서 감사합니다, 당신은 'max_pool_size' 매개 변수로 팁을 공유 할 수 있습니까? – est

+1

단일 연결에서 허용하는 연결 수를 관리 할 수있는 방법입니다. 귀하의 애플 리케이션이 단일 스레드 있다면 그것은 수영장에서 1을 소비합니다. 대량의 스레드 응용 프로그램 인 경우 스레드 당 하나가있을 것이므로 하나의 서버에서 허용 할 수있는 용량을 제한 할 수 있습니다. – jdi

+1

PyMongo 3에서 "auto_start_request"옵션이 사라졌습니다. – Mithril