Ruby / Rails Thread Sicherheit
Ich habe-hacking mit Ruby von Zeit zu Zeit, aber ich habe nichts getan, groß oder multithreaded. Ich habe gehört, dass die MRT unterstützt nur green threads und JRuby unterstützt native threads über JVM. Allerdings stolpere ich über Kommentare auf den blogs und Diskussionsgruppen, die sagen, dass "Schienen ist nicht thread-safe", oder dass Ruby selbst ist nicht thread-sicher. Zum Beispiel, wenn jemand kommentiert, dass es ein problem mit der require-Anweisung. Das klingt ein bisschen grundsätzlicher.
Ich habe gesehen, dass viele Java-apps, die nicht behandeln, Parallelität richtig, und ich habe Alpträume über Sie von Zeit zu Zeit : -), Aber mindestens Sie kann schreiben von thread-safe Anwendungen in Java, wenn Sie wirklich wissen, was Sie tun (es ist einfach nicht einfach).
Klingt das alles ziemlich beunruhigend, kann mir jemand dies näher auszuführen - was genau ist das problem und wie Rails verwaltet, überhaupt zu arbeiten, wenn dies der Fall ist? Kann ich das schreiben von Multithread-Ruby-code, der ordnungsgemäß funktioniert, ohne race-conditions und deadlocks? Ist es portabel zwischen JRuby und MRT oder muss ich den hack im JVM-spezifische code, um die Vorteile der JVM native threads, richtig?
EDIT:
Ich sollte habe gebeten, zwei Fragen, weil die Menschen nur scheinbar zu beantworten, die Schienen threading-Zeug (das ist nett) und grün threading vs. native threading. Meine Bedenken für die core-Ruby-Probleme-thread Sicherheit noch nicht wirklich angesprochen wurde. Es scheint zumindest eine (ungelösten?) Problem mit erfordern in bestimmten Fällen.
InformationsquelleAutor der Frage auramo | 2009-03-15
Du musst angemeldet sein, um einen Kommentar abzugeben.
In Erster Linie, Ruby 1.9 (die letzten offiziellen release) jetzt verwendet native (kernel -) threads. Frühere Versionen von Ruby verwendet green threads. Um Ihre Frage zu beantworten kurz und bündig, vor 1.9 threads haben, die nicht allgemein verwendet worden, in Ruby-Anwendungen groß oder klein, gerade weil Sie sind nicht besonders sicher oder zuverlässig.
Dies ist nicht besonders alarmierend, weil vor version 2.2 Schienen keinerlei Versuch unternommen werden, threadsicher, und so sind wir in der Regel mit der asynchronen Verarbeitung durch die Verwendung mehrerer Prozesse, Datenbank-Datensatz-locking und message queues wie Starling. Dies ist im Allgemeinen eine ziemlich zuverlässige Methode zum skalieren einer web Anwendung-mindestens so zuverlässig als falsch Multithread-Java-Anwendungen-und hat den zusätzlichen Vorteil, dass es einfacher wird, skalieren Sie Ihre Anwendung seitwärts auf mehrere Prozessoren und Server.
Ich habe keine Ahnung, ob das 'verlangen' Problem, das Sie erwähnt haben, wurde gelöst, als der 1.9, aber ich tun, demütig venture, dass, wenn Sie wollen, dass die Bibliotheken dynamisch in neue threads, dann haben Sie mehr als ein Wartbarkeit problem.
Wenn Sie möchten, um zu vermeiden, threads ganz, Ruby 1.9 unterstützt auch Fasern, die beschäftigen einer shared-nothing-Ansatz, um die Parallelität und sind, von dem, was ich sammeln, in der Regel einfacher zu schreiben und zu pflegen, als threads. Performance-zahlen hier.
InformationsquelleAutor der Antwort Brian Guthrie
Empfehle ich, Sie zu beobachten, Jim Weirich ist die Rede von der RubyConf 2008 (es ist sehr lustig und informativ:) :
https://www.youtube.com/watch?v=fK-N_VxdW7g
Dieser ist auch nett:
http://rubyconf2008.confreaks.com/summer-of-code-rails-thread-safety.html
InformationsquelleAutor der Antwort Marcin Urbanski
Die normale Lösung für die MRT ist für die Ausführung mehrerer Schienen Instanzen, die jeweils die Bearbeitung von Anträgen unabhängig. Da die MRT ist nicht Multithread-wie auch immer, Sie können nicht für mehrere Schienen Instanzen oben drauf. Dies bedeutet, dass Sie einen memory-Treffer, da Schienen geladen wird einmal pro Ruby-Prozess.
Seit JRuby unterstützt native threads, könnte man immer mehrere Schienen-Instanzen in einer einzigen JVM. Aber mit Schienen als thread-sicher, schneiden Sie es, bis auf eins, was bedeutet, geringerer Speicherverbrauch und weniger die JIT-Kompilierung.
Charles Nutter (JRuby) hat eine schöne Zusammenfassung.
InformationsquelleAutor der Antwort Kjetil Ødegaard
Ich denke, dass die vorherigen Poster bedeckt die Schienen Fällen ziemlich gut, so dass ich gewonnen ' T die Mühe gehen ins Zeug.
Es ist sicherlich möglich zu schreiben Gewinde Ruby-Anwendungen. Einige der Probleme, die es mit ruby-threads ist, dass Sie 'grün', wie Sie verwaltet werden von der virtuellen Maschine. Derzeit ist die Standard-interpreter (MRI) hat nur einen wahren system-thread, die ausgetauscht werden sollen, werden von allen threads, dass der Dolmetscher hat die Kontrolle über.
Der Nachteil ist, dass wenn Sie einen computer mit mehreren Prozessoren oder Kernen kann man nicht einen thread in Ihrer Anwendung auf einige andere core. Dies ist eine ziemlich große Sache für Menschen mit Servern und high-performance-apps.
Als für Ihre Dolmetscher-spezifischen-code Frage: ich denke nicht so. AFAIK müssen Sie nicht tun, nichts besonderes zu kümmern JRuby/JVM-threads.
Auch: Dieser Artikel über Igvita, nimmt einen guten Blick auf den Zustand der Gleichzeitigkeit in Ruby.
InformationsquelleAutor der Antwort CJ Bryan