2014-08-28 3 views
3

약 1000 개의 클라이언트와 지속적인 연결을 유지하는 비틀어 진 서버 응용 프로그램이 있습니다. 각 클라이언트는 가끔 내 트위스트 서버에 데이터를 보내고, 그 서버가 MongoDB 데이터베이스에 데이터를 저장하기를 원합니다. 여태까지는 그런대로 잘됐다.pymongo를 꼬인 상태로 사용하는 것이 정확히 잘못되었습니다.

그러나 pymongo 설명서에는 "pymongo를 꼬인 상태로 사용하는 좋은 방법이 없습니다"와 같은 내용이 나와 있습니다. 나는 왜 그런지 이해하지 못한다. 누군가 문제를 정확히 설명하고 함정이 무엇인지 설명해 주시겠습니까? 나는 그것이 동기가되는 pymongo와 관련이 있다고 생각하지만, 내가하고 싶은 것은 데이타베이스에 어떤 것을 넣는 것이다.

하나의 인스턴스 인 pymongo.MongoClient가 connector.py 파일에 선언 된 다음 커넥터를 내 Twisted 팩토리 및 프로토콜을 실행하는 기본 python 파일로 가져온 경우 해당 pymongo 인스턴스를 사용할 수 있어야합니다. 데이터베이스에 데이터를 저장하는 각 프로토콜 (각 클라이언트에 대한 연결)의 .MongoClient.

그래서 정확히 무엇이 문제입니까? 분명히 나는 ​​약간 혼란 스럽다.

답변

5

: pymongo 호출이 차단되면 호출이 돌아올 때까지 트위스트 된 엔진이 정지합니다. 트위스트 된 내부 상태를 무작위로 파괴합니다.

대신 tx-mongo과 같은 꼬인 비교 드라이버를 찾아야합니다. tx-mongo는 pymongo보다 작은 사용자층을 가지고 있습니다. 따라서 해당 문서는 다소 거칠지 만 example 디렉토리에서 필요한 모든 것을 찾을 수 있어야합니다.

배경 : Threading vs Event programing

+0

감사합니다. 하지만 내가하고있는 일은 collection.insert 함수를 사용하여 콜렉션에 문서를 삽입하는 것이다. 나는이 부르심의 결과를 볼 필요가 없습니다. 그것은 단지 불이고 잊을뿐입니다. 파이썬 스레딩 라이브러리의 스레드에서이 호출을 래핑했다고 가정합니다. 여전히 문제가 발생합니까? – Marc

+0

스레딩은 [GIL] (http://en.wikipedia.org/wiki/Global_Interpreter_Lock) 때문에 CPython 이외의 다른 프로그램을 실행하지 않는 한 도움이되지 않습니다. 앱에 많은 헤드 룸이있는 경우 pymongo 호출을 수행하는 것으로 도망 갈 수 있습니다. 즉, 예측할 수 없거나 천박하게 실패 할 것입니다 (이 방법을 속이는 것을 잊어 버리면 디버그 할 수 있습니다). https://github.com/fiorix/mongo-async-python-driver는 트위스티드 네이티브 몽고 드라이버입니다. 과거에는 행운을 빌었습니다. 나중에 후회할 것이 있습니다. –

+0

스레딩은 CPython 표준 라이브러리에 구현 된 I/O 작업을 차단하는 데 GIL이 해제되어 도움이 될 수 있습니다. 본질적으로 Twisted를 사용하는 것처럼 * Twisted를 사용하는 경우 멀티 스레딩과 함께 블로킹 API를 사용하여 많은 스레드 기반 동시성을 얻을 수 있습니다 (즉, Twisted는 스레드를 악화시키지 않습니다. 그 (것)들을 잘 만들지 않는다). –

관련 문제