Pregunta

Tengo una aplicación altamente multiproceso escrita en Ruby que comparte algunas variables de instancia. Las escrituras a estas variables son raras (1%), mientras que las lecturas son muy comunes (99%). ¿Cuál es la mejor manera (ya sea en tu opinión o en la forma idiomática de Ruby) para asegurarte de que estos hilos siempre vean los valores más actualizados involucrados? Aquí hay algunas ideas que tuve ( aunque me gustaría su opinión antes de revisar esto):

  • Tenga un bloqueo que se use más antes de leer o escribir cualquiera de estas variables (de Java concurrencia en la práctica ). La desventaja de esto es que pone muchos bloques sincronizar en mi código y no veo una manera fácil de evitarlo.
  • Utilice el método freeze de Ruby (consulte aquí ), aunque Parece igualmente engorroso y no me brinda ninguno de los beneficios de sincronización que brinda la primera opción.

Ambas opciones parecen bastante similares pero, con suerte, cualquier persona tendrá una idea mejor (o puede argumentar bien sobre una de estas ideas). También estaría bien con hacer que los objetos sean inmutables para que no se corrompan o alteren en medio de una operación, pero no conozco a Ruby lo suficiente como para hacer la llamada por mi cuenta y esta pregunta parece argumentar que los objetos son altamente mutables.

¿Fue útil?

Solución

Usar la cerradura es la forma más apropiada de hacerlo. Puede ver esta presentación de Jim Weirich sobre el tema: Lo que todos los rubistas deberían saber sobre el enhebrado .

Además, congelar un objeto no te ayudará aquí, ya que quieres modificar estas variables. Congelarlos en su lugar significa que no se aplicarán más modificaciones a estos (y, por lo tanto, su 1% de escrituras no funcionará).

Otros consejos

No lo he usado, pero es posible que desee revisar Dataflow . Hace que todas las variables se escriban una vez.

El bloqueo de lectores y escritores es un problema común con una solución bien definida:

Bloqueo de lectores y escritores

y hay muchas implementaciones de esto:

Escriba el patrón de bloqueo

No desea poner un bloqueo en cada lectura / escritura

Tienes que usar un Mutex para sincronizar el acceso al estado compartido. Realmente no hay manera de evitar hacer esto.

En las máquinas modernas de múltiples núcleos no puede hacer suposiciones sobre cómo se accederá a la memoria o cómo los accesos de la memoria interactuarán con el almacenamiento en caché.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top