2010-03-15 8 views
6

Notre groupe de serveurs se compose de 20 machines, chacune avec 10 pids de 5 threads. Nous souhaitons éviter que deux threads, dans un pid, sur une machine, ne modifient le même objet en même temps.Quels sont les bons moyens de verrouillage intermachine?

Notre code est écrit en Python et fonctionne sous Linux, si cela permet de réduire les choses.

Aussi, il est assez rare que deux de ces threads le fassent, donc nous préférerions quelque chose qui optimise le cas "un seul thread a besoin de cet objet" pour être vraiment rapide, même si cela signifie que le " un thread a verrouillé cet objet et un autre en a besoin "le boîtier n'est pas génial.

Quelles sont certaines des meilleures pratiques?

+0

Comment faites-vous la communication inter-processus? Utilisez-vous l'une des implémentations Python MPI, ou utilisez-vous le système de fichiers, ou ...? – stephan

Répondre

5

Si vous souhaitez synchroniser entre toutes les machines que vous avez besoin d'une Distributed Lock Manager.

J'ai fait un peu de googling et suis arrivé avec: Stackoverflow. Malheureusement, ils ne proposent que la version Java, mais c'est un début.

Si vous essayez de synchroniser l'accès aux fichiers: Votre système de fichiers doit déjà avoir un certain nombre de services de verrouillage en place. Si ce n'est pas envisagé de le changer.

-3

Il peut y avoir une meilleure façon de le faire, mais j'utiliser la classe de verrouillage du module de filetage pour accéder aux objets « protégés » dans une avec la déclaration, ici serait un exemple:

from __future__ import with_statement  
from threading import Lock 

mylock = Lock() 
with mylock.acquire(): 
    [ 'do things with protected data here' ] 
[ 'the rest of the code' ] 

Pour plus d'exemples sur les utilisations de verrouillage, regardez here.

Edit: cette solution ne convient pas à cette question threading.Lock n'est pas distribué, désolé

+1

Non distribué. –

+0

Oh, n'a pas pensé à ce point: s – MatToufoutu

3

Je suppose que vous êtes tombé sur ce blog http://amix.dk/blog/post/19386 pendant votre recherche sur Google?

L'auteur présente une interface simple à memcachedb qu'il utilise comme un gestionnaire de verrou distribué factice. C'est une excellente idée, et memcache est probablement l'une des choses les plus rapides avec lesquelles vous pourrez interagir. Notez qu'il utilise l'instruction plus récemment ajoutée avec l'instruction.

Voici un exemple d'utilisation de son poste de blog:

from __future__ import with_statement 
import memcache 
from memcached_lock import dist_lock 

client = memcache.Client(['127.0.0.1:11211']) 
with dist_lock('test', client): 
    print 'Is there anybody out there!?' 
1

écrire du code en utilisant des objets immuables. Écrire des objets qui implémentent le motif singleton.

Utilisez une technologie de messagerie distribuée stable telle que IPC, Webservices ou XML-RPC.

Je voudrais jeter un oeil à Twisted. Ils ont beaucoup de solutions pour une telle tâche.

Je n'utiliserais pas de threads dans Python esp en ce qui concerne le GIL, je voudrais utiliser des processus comme applications de travail et utiliser une technologie de communication comme décrit ci-dessus pour les intercommunications.

Votre classe singleton pourrait alors apparaître dans l'une de ces applications et être interfacée via la technologie de communication de votre choix.

Pas une solution rapide avec tous les interfaçage, mais si cela est fait correctement, devrait être stable.

1

Si vous pouvez obtenir l'infrastructure complète pour un gestionnaire de verrous distribués, alors allez-y et utilisez-le. Mais cette infrastructure n'est pas facile à configurer! -désigner le noeud avec l'adresse IP la plus basse comme noeud principal (cela signifie que si le noeud avec l'adresse IP la plus basse se bloque, un nouveau noeud avec l'adresse IP la plus basse deviendra le nouveau maître)

-let tous les nœuds contactent le nœud maître pour obtenir le verrou sur l'objet. -le nœud principal utilise la sémantique du verrou natif pour obtenir le verrou. Ceci simplifiera les choses à moins que vous ayez besoin d'une infrastructure de clustering complète et de DLM pour faire le travail.