2012-06-10 12 views
15

Ich weiß pymongo ist Thread sicher und hat einen eingebauten Verbindungspool.Pymongo Verbindung Pooling und Client-Anfragen

In einer Webanwendung, an der ich arbeite, erstelle ich bei jeder Anfrage eine neue Verbindungsinstanz.

Ich verstehe, dass seit pymongo den Verbindungspool verwaltet, ist es nicht falsch, eine neue Verbindung bei jeder Anfrage zu erstellen, da am Ende der Anfrage die Verbindungsinstanz zurückgefordert wird und bei nachfolgenden Anfragen verfügbar sein wird .

Bin ich hier richtig, oder sollte ich nur eine einzelne Instanz für die Verwendung über mehrere Anfragen erstellen?

Antwort

8

Der "falsche Ansatz" hängt von der Architektur Ihrer Anwendung ab. Da pymongo thread-sicher und automatisches Verbindungs-Pooling ist, wird die tatsächliche Verwendung einer einzelnen gemeinsamen Verbindung oder mehrerer Verbindungen "funktionieren". Aber die Ergebnisse hängen davon ab, wie Sie das Verhalten erwarten. Die Dokumentation kommentiert beide Fälle.

Wenn Ihre Anwendung Threading ist, erhält jeder Thread, der auf eine Verbindung zugreift, seinen eigenen Socket. Unabhängig davon, ob Sie eine einzelne freigegebene Verbindung erstellen oder eine neue anfordern, hängt es davon ab, ob Ihre Anforderungen Threads sind oder nicht.

Wenn Sie gevent verwenden, können Sie einen Socket pro Greenlet haben. Dies bedeutet, dass Sie keinen echten Thread pro Anfrage haben müssen. Die Anfragen können asynchron sein und trotzdem einen eigenen Socket erhalten.

Auf den Punkt gebracht:

  • Wenn Ihre Webapp Anfragen mit Gewinde versehen sind, dann spielt es keine Rolle, welche Art und Weise Sie eine neue Verbindung zugreifen. Das Ergebnis ist dasselbe (Socket pro Thread)
  • Wenn Ihre Webanwendung über gevent async ist, spielt es keine Rolle, auf welche Weise Sie auf eine neue Verbindung zugreifen. Das Ergebnis wird dasselbe sein. (Socket pro Greenlet)
  • Wenn Ihre Webanwendung async ist, aber NICHT über gevent, dann müssen Sie die Hinweise auf der best suggested workflow berücksichtigen.