Was ist der aktuelle Stand der Dinge auf threading, Parallelität und gegabelt Prozesse, in Ruby on Rails?

StackOverflow https://stackoverflow.com/questions/129226

  •  02-07-2019
  •  | 
  •  

Frage

Ruby on Rails ist nicht multithreaded Anfrage-Antworten sehr gut, oder zumindest, Active nicht.

Der Begriff der nur eine Anfrage-Antwort aktiv zugleich kann einen Streit, wenn Web-Anwendungen Erstellen einen Shell-Befehls, die Gabel aus, die bis zum Ende lange dauert.

Was ich möchte, sind einige Ihrer Ansichten auf diese Art von Setups? Ist Rails vielleicht nicht eine gute Passform für einige Anwendungen?

Auch, was ist der aktuelle Stand der Dinge in Bezug auf der Parallelität in Ruby on Rails? Was sind die besten Praktiken. Gibt es Workarounds auf die Mängel?

War es hilfreich?

Lösung

Rails zur Zeit nicht verarbeitet gleichzeitige Anforderungen innerhalb eines einzigen MRT (Matz Ruby-Interpreter) Ruby-Prozesses. Jede Anfrage wird essentally mit einem riesigen Mutex gewickelt. Viel Arbeit wurde in die Herstellung der bevorstehenden Rails 2.2 Thread-sicher gegangen, aber du bist nicht viel Nutzen aus dieser in Gang zu bringen, wenn sie unter Rubin 1.8x ausgeführt wird. Ich kann nicht kommentieren, ob Ruby 1.9 wird anders sein, weil ich nicht mit ihm sehr vertraut bin, aber wahrscheinlich nicht, dass ich hätte gedacht.

Ein Bereich, der sehr viel versprechend sieht in dieser Hinsicht Rails mit JRuby ausgeführt wird, weil die JVM im Allgemeinen als gut bei Multi-Threading quittiert wird. Arun Gupta von Sun Microsystems einige interessante Kennzahlen auf diesem Setup auf RailsConf Europa vor kurzem.

Andere Tipps

Neverblock ermöglicht nicht blockierende Funktionalität ohne Änderung der Art und Weise Sie Programme schreiben. Es ist wirklich ein spannendes Projekt suchen, und wurde zum Ruby 1.8.x arbeiten, zurückzuportierte (es verläßt sich auf Fasern Ruby 1.9 ist). Es funktioniert sowohl mit PostgreSQL und MySQL non-blocking-Abfragen durchführen. Die Benchmarks rel="nofollow sind verrückt ...

Matz Ruby 1.8 verwendet grüne Fäden und Matz Ruby 1.9 wird verwenden nativen O / S Threads. Andere Implementierungen von Ruby 1.8, wie JRuby und IronRuby verwenden nativen O / S-Threads. YARV, die Abkürzung für Yet Another Ruby-VM verwendet auch nativen O / S-Threads aber hat einen globalen Interpreter Lock, um sicherzustellen, dass nur eine Ruby-Thread zu einem bestimmten Zeitpunkt ausgeführt wird.

Wenn das, was Sie am Shell laufen für die Darstellung der Seite nicht erforderlich ist (zum Beispiel sind Sie nur auslösenden Wartungsaufgaben oder etwas), sollten Sie sie als Hintergrundprozess starten. Schauen Sie sich Star und workling.

Wenn dies auf Ihre Situation gilt nicht, werden Sie sicher, dass mehrere Instanzen Ihrer App-Server laufen machen. Traditionell würden die Leute mehrere Instanzen von Mongrel starten. Aber jetzt würde ich sagen, der einfachste Weg, eine feste Einrichtung haben, ist bei weitem mit Phusion Passagiere . Es ist ein Apache-Modul, das Sie ganz einfach, wie viele Instanzen (min und max) Ihrer App Server, die Sie haben wollen, laufen angeben können. Passagier erledigt den Rest. Und wenn ich mich recht erinnere, es macht nicht dumm Round-Robin für Anfragen Dispatching. Ich denke, es ist nach Verfügbarkeit.

Ruby 1.9 ist das Hinzufügen von leichten Fasern:

http://www.infoq.com/news / 2007/08 / Rubin-1-9-Fasern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top