Ich habe eine in Ruby geschriebene App mit mehreren Multithreads, die ein paar Instanzvariablen teilt. Schreibvorgänge auf diese Variablen sind selten (1%), während Lesevorgänge sehr häufig sind (99%). Was ist der beste Weg (entweder Ihrer Meinung nach oder in der idiomatischen Ruby-Mode), um sicherzustellen, dass diese Themen immer die aktuellsten Werte enthalten? Hier sind einige Ideen, die ich bisher hatte ( obwohl ich deine Eingabe gerne hätte, bevor ich das überarbeite):
synchronize
Blöcke in meinen Code steckt und ich sehe keinen einfachen Weg, dies zu vermeiden. freeze
Methode (siehe hier ), obwohl sie genauso umständlich aussieht und mir keine gibt der Synchronisierungsvorteile, die die erste Option bietet. Diese Optionen scheinen beide ziemlich ähnlich zu sein, aber hoffentlich wird jeder da draußen eine bessere Idee haben (oder kann für eine dieser Ideen gut argumentieren). Es wäre auch in Ordnung, die Objekte unveränderlich zu machen, so dass sie während einer Operation nicht beschädigt oder verändert werden, aber ich kenne Ruby nicht gut genug, um den Aufruf alleine zu machen und diese Frage scheint zu argumentieren, dass Objekte sehr veränderlich sind.
Die Verwendung der Sperre ist der geeignetste Weg, dies zu tun. Sie können diese Präsentation von Jim Weirich zu dem Thema sehen: Was alle Rubyist wissen sollten Threading .
Auch das Einfrieren eines Objekts hilft Ihnen hier nicht, da Sie diese Variablen ändern möchten. Wenn Sie sie einfrieren, bedeutet dies, dass keine weiteren Änderungen mehr auf diese angewendet werden können (und daher wird Ihre 1% ige Schreibweise nicht funktionieren).
Ich habe es selbst nicht benutzt, aber Sie sollten sich vielleicht Datenfluss . Es macht alle Variablen einmal schreiben.
Sie müssen einen Mutex verwenden, um den Zugriff auf den gemeinsamen Status zu synchronisieren. Es gibt wirklich keine Möglichkeit, dies zu vermeiden.
Auf modernen Multi-Core-Rechnern können Sie keine Annahmen darüber treffen, wie auf Speicher zugegriffen wird oder wie Speicherzugriffe mit Caching interagieren.
Tags und Links ruby multithreading immutability