2010-06-16 2 views
0

Un dictionnaire de niveau de module 'd' auquel accèdent différents threads/demandes dans une application Web django. J'ai besoin de mettre à jour 'd' chaque minute avec une nouvelle donnée et le processus prend environ 5 secondes.Mise à jour d'un dictionnaire partagé de niveau module

Quelle pourrait être la meilleure solution où je veux que les utilisateurs obtiennent soit l'ancienne valeur ou la nouvelle valeur de d et rien entre les deux.

Je peux penser à une solution où un dictionnaire temporaire est construit avec de nouvelles données et assigné à 'd' mais je ne sais pas comment cela fonctionne!

Appréciez vos idées.

Merci

Répondre

2

Probablement mieux - au niveau du module:

import threading 
dlock = threading.Lock() 
d = {} 

et chaque accès à d (! pas seulement des modifications) se trouve dans un bloc with:

with dlock: 
    found = k in d 

et similaires (si vous êtes sur Python 2.5, yo vous devrez également avoir from __future__ import with_statement en haut de votre module).

Ceci protège d avec le verrou, donc les modifications sont sérialisées. La raison pour laquelle la garde est également nécessaire autour de l'accès non modifiable à d est que vous pourriez avoir des problèmes même dans des opérations de type "read-like" (if k in d:, d.get(k), etc) si la dict est "modifiée de droite à droite dans l'opération". au milieu de celui-ci ".

D'autres architectures peuvent être basées sur l'encapsulation du dictionnaire (soit pour protéger toutes les méthodes nécessaires avec le verrou, soit pour déléguer un thread spécial pour effectuer toutes les opérations du dictionnaire et communiquer avec tous les autres threads). mais je pense que dans ce cas particulier, la solution simple et sans fioritures fonctionne pour le mieux.

+0

Les utilisateurs doivent-ils attendre lorsque d est en cours de modification ou peuvent-ils toujours obtenir l'ancienne valeur de d? – Vishal

+0

@Vishal, ils doivent attendre les quelques microsecondes qu'il faut pour obtenir le verrou - je doute que quelqu'un le remarquera jamais ;-). Cela prendrait beaucoup plus de temps pour "prendre un instantané", et si deux threads le font et que chacun sauvegarde atomiquement sa version modifiée, les modifications d'un thread seront totalement perdues (même si elles sont complètement différentes & c - elles disparaîtront dans l'éther). –

+0

@Alex, Que se passe-t-il si la mise à jour de d prend quelques secondes, alors les threads attendent pour obtenir le verrou? ou vouliez-vous dire assigner temp à d comme dans la question? – Vishal

Questions connexes