2010-03-15 13 views
6

Il nostro cluster di server è composto da 20 macchine, ciascuna con 10 pid di 5 thread. Ci piacerebbe un modo per impedire a due thread, in qualsiasi pid, su qualsiasi macchina, di modificare lo stesso oggetto nello stesso momento.Quali sono alcuni buoni modi per eseguire il blocco di intermachine?

Il nostro codice è scritto in Python e gira su Linux, se questo aiuta a restringere le cose.

Inoltre, è un caso piuttosto raro che due thread di questo tipo vogliano fare questo, quindi preferiremmo qualcosa che ottimizzi il caso "solo un thread ha bisogno di questo oggetto" per essere veramente veloce, anche se questo significa che il " un thread ha bloccato questo oggetto e un altro ne ha bisogno "il caso non è eccezionale.

Quali sono alcune delle migliori pratiche?

+0

Come si fa la comunicazione tra processi? Usi una qualsiasi delle implementazioni di Python MPI o usi il file system o ...? – stephan

risposta

5

Se si desidera sincronizzare tra più computer è necessario un Distributed Lock Manager.

Ho fatto un po 'di ricerca su Google e ho trovato: Stackoverflow. Sfortunatamente suggeriscono solo la versione Java, ma è un inizio.

Se si sta tentando di sincronizzare l'accesso ai file: il proprio filesystem dovrebbe già disporre di un servizio di chiusura del posto. Se non considerare di cambiarlo.

-3

Ci può essere un modo migliore di fare questo, ma vorrei utilizzare la classe di blocco dal modulo threading per accedere agli oggetti "protetti" in una con la dichiarazione, qui sarebbe un esempio:

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' ] 

per ulteriori esempi su Usi di blocco, dai un'occhiata a here.

Edit: questa soluzione non è adatto a questa domanda in quanto threading.Lock non è distribuito, mi dispiace

+1

Non distribuito. –

+0

Oh, non ho pensato a questo punto: s – MatToufoutu

3

Immagino che tu abbia trovato questo post sul blog http://amix.dk/blog/post/19386 durante le tue ricerche su Google?

L'autore mostra una semplice interfaccia per memcachedb che utilizza come gestore di blocco distribuito fittizio. È una grande idea e memcache è probabilmente una delle cose più veloci con cui potrai interfacciarti. Si noti che utilizza la più recente aggiunta con la dichiarazione.

Ecco un esempio di utilizzo dal suo post sul 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

scrivere codice usando oggetti immutabili. Scrivi oggetti che implementano il Pattern Singleton.

Utilizzare una tecnologia di messaggistica distribuita stabile come IPC, servizi Web o XML-RPC.

Vorrei dare un'occhiata a Twisted. Hanno un sacco di soluzioni per tale compito.

Non vorrei usare thread in esp di Python per quanto riguarda GIL, vorrei considerare l'utilizzo di Processi come applicazioni di lavoro e utilizzare una tecnologia di comunicazione come descritto sopra per le comunicazioni interne.

La classe singleton potrebbe quindi apparire in una di queste applicazioni e interfacciata tramite la tecnologia di comunicazione di scelta.

Non è una soluzione rapida con tutte le interfacce, ma se fatto correttamente dovrebbe essere stabile.

1

se è possibile ottenere l'infrastruttura completa per un gestore di blocco distribuito, andare avanti e utilizzarlo. Ma quell'infrastruttura non è facile da installare! Ma ecco una soluzione pratica:

-designate il nodo con l'indirizzo ip più basso del nodo master (ciò significa che se il nodo con indirizzo IP più basso si blocca, un nuovo nodo con indirizzo IP più basso diventerà nuovo master)

-let tutti i nodi contattano il nodo principale per ottenere il blocco sull'oggetto.

-let il nodo principale utilizza semantica di blocco nativo per ottenere il blocco.

questo semplifica le cose a meno che non sia necessaria la completa infrastruttura di clustering e DLM per fare il lavoro.

Problemi correlati