2012-07-24 10 views
11

Wenn ich boto.connect_xxx, wo xxx ist ein Service (dynamodb, s3, etc) mehrere Male, ruft es jedes Mal einen neuen Verbindungspool erstellen? Was ich möchte, ist, etwas zu tun wie folgt aus (Beispiel in Flask):Boto connect_xxx Methode und Verbindungspools

@app.before_request 
def before_request(): 
    g.db = connect_dynamodb() 

um sicherzustellen, dass ich immer verbinden, aber ich möchte nicht, dass dies vor jeder Anforderung tun, wenn es neue Sicherheitstoken schaffen usw., die ganze Rigamarole, jedes Mal. Ist es sicher, connect_xxx() einmal beim Start der Anwendung aufzurufen und sich auf Boto zu verlassen, um nach Bedarf neue Verbindungen zu generieren?

Antwort

11

Der beste Ansatz besteht darin, die Methode connect_xxx einmal aufzurufen, wenn Ihre Anwendung gestartet wird, und von da an darauf zu vertrauen, dass boto die Verbindung verwaltet. Die einzige Ausnahme von dieser Regel ist, wenn Sie mehrere Threads verwenden. In diesem Fall sollte jeder Thread seine eigene Verbindung erstellen, da Boto httplib verwendet, was nicht threadsicher ist.

Auch wenn Sie die Methode connect_xxx vor jeder Anfrage aufrufen, sollten Sie wirklich in Ordnung sein. Boto puffert die Verbindung auf Klassenebene und sollte dies auf ziemlich effiziente Weise handhaben.

+1

Danke für die Antwort! Und danke für Boto selbst, ich könnte nicht ohne sie leben. Ihre Erwähnung von Threads führte zu einer weiteren Frage zum im Wesentlichen gleichen Thema [hier] (http://stackoverflow.com/questions/11640031/uwsgiflaskboto-thread-safety). –

+0

Gibt es Dokumentationsreferenzen für diese Informationen? –

+0

Die Methoden '' connect_xxx'' geben eine Instanz einer Unterklasse von '' AWSAuthConnection'' zurück, die tatsächlich Thread-sicher ist. Sie sollten dies nur einmal pro Prozess (und Verbindungsargumente) tun - nicht in jedem Thread. Der Verbindungspool wird nicht auf Klassenebene gespeichert. – malthe