2010-03-15 16 views
6

Nuestro clúster de servidores consta de 20 máquinas, cada una con 10 pids de 5 hilos. Nos gustaría alguna manera de evitar que dos hilos, en cualquier pid, en cualquier máquina, modifiquen el mismo objeto al mismo tiempo.¿Cuáles son algunas buenas maneras de hacer el bloqueo intermachine?

Nuestro código está escrito en Python y se ejecuta en Linux, si eso ayuda a reducir las cosas.

Además, es un caso muy raro que dos de estos hilos quieran hacer esto, por lo que preferiríamos algo que optimice el caso "solo un hilo necesita este objeto" para ser realmente rápido, incluso si eso significa " un hilo ha bloqueado este objeto y otro lo necesita "caso no es genial.

¿Cuáles son algunas de las mejores prácticas?

+0

¿Cómo se hace la comunicación entre procesos? ¿Utiliza alguna de las implementaciones de Python MPI, o usa el sistema de archivos, o ...? – stephan

Respuesta

5

Si desea sincronizar a través de las máquinas que necesita un Distributed Lock Manager.

Hice algunos google rápidamente y se me ocurrió: Stackoverflow. Desafortunadamente, solo sugieren la versión de Java, pero es un comienzo.

Si está tratando de sincronizar el acceso a los archivos: Su sistema de archivos ya debería tener algún tipo de servicio de bloqueo en su lugar. Si no, considera cambiarlo.

-3

Puede haber una mejor manera de hacer esto, pero me gustaría utilizar la clase de bloqueo del módulo threading para acceder a los objetos "protegidos" en una sentencia with, aquí sería un ejemplo:

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

para obtener más ejemplos sobre los usos de bloqueo, eche un vistazo a here.

Editar: esta solución no es adecuado para esta cuestión como threading.Lock no se distribuye, lo siento

+1

No distribuido. –

+0

Oh, no pensé en ese punto: s – MatToufoutu

3

Supongo que se encontró con esta publicación de blog http://amix.dk/blog/post/19386 durante su búsqueda en Google?

El autor muestra una interfaz simple para memcachedb que utiliza como un administrador de bloqueo distribuido ficticio. Es una gran idea, y Memcache es probablemente una de las cosas más rápidas con las que podrás interactuar. Tenga en cuenta que sí utiliza el más recientemente agregado con la declaración.

Aquí es un ejemplo de uso de su entrada en el 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

Escribir código utilizando objetos inmutables. Escribir objetos que implementen el Patrón Singleton.

Use una tecnología de mensajería distribuida estable como IPC, servicios web o XML-RPC.

Me gustaría echar un vistazo a Twisted. Tienen muchas soluciones para tal tarea.

No utilizaría hilos en Python esp con respecto al GIL, consideraría el uso de Procesos como aplicaciones en funcionamiento y el uso de una tecnología de comunicación tal como se describe anteriormente para las intercomunicaciones.

Su clase singleton podría entonces aparecer en una de estas aplicaciones e interconectarse a través de la tecnología de comunicación de su elección.

No es una solución rápida con todas las interfaces, pero si se hace correctamente, debe ser estable.

1

si puede obtener la infraestructura completa para un administrador de bloqueo distribuido, continúe y utilice eso. ¡Pero esa infraestructura no es fácil de configurar! Pero aquí hay una solución práctica:

-designe el nodo con la dirección IP más baja como el nodo maestro (eso significa que si el nodo con la dirección IP más baja se bloquea, un nuevo nodo con la dirección IP más baja se convertirá en el nuevo maestro)

-let todos los nodos en contacto con el nodo maestro para obtener el bloqueo en el objeto.

-let el nodo principal utiliza la semántica de bloqueo nativo para obtener el bloqueo.

Esto simplificará las cosas a menos que necesite una infraestructura completa de clustering y DLM para hacer el trabajo.

Cuestiones relacionadas