3 Stimmen

Schneller, Thread-sicherer Ruby Hash mit starker Lesevorliebe

Ich brauche Hilfe beim Verständnis von Hash in Ruby 1.8.7.

Ich habe eine Multi-Thread-Ruby-Anwendung, und etwa 95% der Zeit mehrere Threads der Anwendung versuchen, einen globalen Hash zugreifen.

Ich bin nicht sicher, ob der Standard-Ruby-Hash thread-sicher ist. Was wäre der beste Weg, um eine schnelle Hash haben, sondern auch eine, die Thread sicher angesichts meiner Situation ist?

2voto

Jörg W Mittag Punkte 349574

Der Standard-Ruby Hash ist nicht thread-sicher. Unter MRI und YARV ist es "irgendwie zufällig thread-sicher", weil MRI und YARV eine kaputte Threading-Implementierung haben, die ohnehin nicht in der Lage ist, zwei Threads gleichzeitig laufen zu lassen. Bei JRuby, IronRuby und Rubinius ist dies jedoch nicht der Fall.

1voto

Alex D Punkte 28883

Ich würde einen Wrapper vorschlagen, der die Hash mit einer Lese- und Schreibsperre. Ich konnte keine vorgefertigte Ruby-Implementierung einer Lese- und Schreibsperre finden (JRuby-Benutzer können natürlich java.util.concurrent.ReentrantReadWriteLock verwenden), also habe ich eine gebaut. Sie können sie sehen unter:

https://github.com/alexdowad/showcase/blob/master/ruby-threads/read_write_lock.rb

Ich und zwei andere Leute haben es auf MRI 1.9.2, MRI 1.9.3 und JRuby getestet. Es scheint korrekt zu funktionieren (obwohl ich noch gründlichere Tests durchführen möchte). Es hat ein eingebautes Testskript; wenn Sie eine Multi-Core-Maschine haben, laden Sie es bitte herunter, versuchen Sie, es auszuführen, und lassen Sie mich die Ergebnisse wissen! Was die Leistung anbelangt, so übertrifft es Mutex in Situationen mit einem Lesefehler. Selbst in Situationen mit 80-90% Schreibzugriff ist es immer noch scheint ein wenig schneller zu sein als die Verwendung einer Mutex.

Ich habe auch vor, eine Ruby-Portierung von Java's ConcurrentHashMap zu machen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X