2008-10-17 7 views
9

J'ai implémenté un serveur web python. Chaque requête http engendre un nouveau thread. J'ai une exigence de mise en cache des objets en mémoire et puisque c'est un serveur web, je veux que le cache soit thread safe. Existe-t-il une implémentation standard d'un cache d'objet thread-safe en python? J'ai trouvé ce qui suitpython threadsafe object cache

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

Cela ne semble pas être thread-safe. Quelqu'un peut-il me diriger vers une bonne implémentation du cache thread-safe en python?

Merci!

Répondre

8

Bon nombre d'opérations en Python sont thread-safe par défaut, donc un dictionnaire standard devrait être ok (au moins à certains égards). Ceci est principalement dû au GIL, qui aidera à éviter certains des problèmes de threading les plus sérieux.

Il y a une liste ici: http://coreygoldberg.blogspot.com/2008/09/python-thread-synchronization-and.html qui pourrait être utile.

Bien que la nature atomique de ces opérations signifie simplement que vous ne disposerez pas d'un état totalement incohérent si vous avez deux threads accédant à un dictionnaire en même temps. Donc, vous n'auriez pas une valeur corrompue. Cependant, vous ne pourriez pas (comme avec la plupart des programmes multi-threading) compter sur l'ordre spécifique de ces opérations atomiques.

Donc, pour couper une longue histoire courte ...

Si vous avez des exigences assez simples et ne sont pas pris la peine de l'ordre de ce qui se cache dans le écrit, vous pouvez utiliser un dictionnaire et de savoir que vous obtiendra toujours une valeur cohérente/non-corrompue (elle pourrait être périmée).

Si vous voulez vous assurer que les choses sont un peu plus cohérente en ce qui concerne la lecture et l'écriture, vous voudrez peut-être regarder la mémoire cache locale de Django:

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

qui utilise une lecture/verrouillage d'écriture pour le verrouillage.

4

Vous souhaitez probablement utiliser memcached à la place. Il est très rapide, très stable, très populaire, a de bonnes bibliothèques Python, et vous permettra de croître à un cache distribué si vous devez:

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

9

thread par demande est souvent une mauvaise idée. Si votre serveur subit d'énormes pics de charge, il mettra la boîte à genoux. Envisagez d'utiliser un pool de threads qui peut atteindre une taille limitée lors de l'utilisation maximale et réduire la taille à une taille plus petite lorsque la charge est faible.

2

Pour un objet thread sûr vous voulez threading.local:

from threading import local 

safe = local() 

safe.cache = {} 

Vous pouvez ensuite mettre et récupérer des objets dans safe.cache avec fil de sécurité.

+2

Vous devez indiquer qu'un cache local de thread ne partagera pas les objets entre les threads. –