2008-10-17 8 views
9

Ich habe einen Python-Webserver implementiert. Jede HTTP-Anforderung erzeugt einen neuen Thread. Ich habe die Anforderung, Objekte im Speicher zwischenzuspeichern, und da es sich um einen Webserver handelt, möchte ich, dass der Cache Thread-sicher ist. Gibt es eine Standardimplementierung eines threadsicheren Objektcaches in Python? Ich fand den folgendenPython threadsafe Objektcache

http://freshmeat.net/projects/lrucache/

Dies sieht nicht Thread-sicher zu sein. Kann mich jemand auf eine gute Implementierung von threadsicherem Cache in Python hinweisen?

Danke!

Antwort

8

Nun, viele Operationen in Python sind standardmäßig threadsicher, daher sollte ein Standardwörterbuch in Ordnung sein (zumindest in bestimmten Punkten). Dies ist hauptsächlich auf die GIL zurückzuführen, mit der einige der gravierenderen Threading-Probleme vermieden werden können.

Es gibt eine Liste hier: http://coreygoldberg.blogspot.com/2008/09/python-thread-synchronization-and.html das könnte nützlich sein.

Obwohl die atomare Natur dieser Operation nur bedeutet, dass Sie keinen völlig inkonsistenten Zustand haben, wenn Sie zwei Threads gleichzeitig auf ein Wörterbuch zugreifen. Sie hätten also keinen beschädigten Wert. Allerdings würden Sie (wie bei der meisten Multi-Threading-Programmierung) nicht in der Lage sein, sich auf die spezifische Reihenfolge dieser atomaren Operationen zu verlassen.

So eine lange Geschichte kurz zu schneiden ...

Wenn Sie recht einfach Anforderungen haben und nicht über die Bestellung von gestört, was in den Cache geschrieben werden, dann können Sie ein Wörterbuch verwenden und wissen, dass Sie bekomme immer einen konsistenten/nicht-korrumpierten Wert (es könnte nur veraltet sein).

Wenn Sie möchten, um sicherzustellen, dass die Dinge ein wenig mehr im Einklang mit Bezug auf das Lesen und Schreiben sind dann möchten Sie vielleicht bei Django lokalen Speicher-Cache suchen:

http://code.djangoproject.com/browser/django/trunk/django/core/cache/backends/locmem.py

, die eine Lese-/Schreibsperre verwendet zum Sperren.

4

Wahrscheinlich möchten Sie stattdessen memcached verwenden. Es ist sehr schnell, sehr stabil, sehr beliebt, hat eine gute Python-Bibliotheken, und ermöglicht es Ihnen, zu einem verteilten Cache wachsen sollten Sie brauchen:

http://www.danga.com/memcached/

9

Thread pro Anfrage ist oft eine schlechte Idee. Wenn Ihr Server große Lastspitzen hat, wird er die Box in die Knie zwingen. Erwägen Sie die Verwendung eines Thread-Pools, der während der Spitzennutzung auf eine begrenzte Größe wachsen und bei geringer Last auf eine kleinere Größe verkleinert werden kann.

2

Für einen Thread-sicher Objekt möchten Sie threading.local:

from threading import local 

safe = local() 

safe.cache = {} 

Sie können dann Objekte in safe.cache mit Thread-Sicherheit setzen und abzurufen.

+2

Sie sollten darauf hinweisen, dass ein thread-lokaler Cache keine Objekte über Threads hinweg freigeben wird. –

Verwandte Themen