Ich versuche den Unterschied zwischen Ruby-Threads vor 1.9 und 1.9 (in der Standard-MRI-Implementierung) zu verstehen, aber es scheint, dass sie in Bezug auf die Vorteile, die Sie damit erzielen können, praktisch identisch sind. Ist das korrekt?
Von meinem begrenzten Verständnis:
Stimmt das, oder fehlt mir etwas? Was sind die Vorteile von 1.9 Threads im Vergleich zu vor 1.9 Threads (in MRI)?
Ich fühle mich irgendwie dumm, dies als Antwort anzubieten, aber Ihre Beschreibung passt perfekt zu meinem Verständnis der Situation.
Wenn wir Recht haben, sollte ich hinzufügen, dass es Sinn macht, die Sprache auf diese Weise zu entwickeln.
Beachten Sie, dass ein Hauptpunkt der funktionalen Programmierung Das Actor Model, und andere Shared-Memory-Alternative-Parallelmodelle sollen die extreme Schwierigkeit bei der Entwicklung einer parallelen Shared-Memory-Anwendung beheben. ("Threads, die als schädlich angesehen werden.")
Es hätte also viel zu viel erwartet, dass Ruby von nichts - parallel zu allem - parallel geht.
Der aktuelle Ansatz scheint darin zu bestehen, den Mechanismus einzurichten, aber das Riesenschloss zu halten. Ich gehe davon aus, dass in Zukunft individuell ausgeführte und getestete Funktionsbereiche parallel ausgeführt werden können, da sie genaueste Sperren und Gleichzeitigkeitsprüfungen erhalten.
Ihre Analyse ist vollkommen korrekt, Ruby 1.9 verwendet jetzt nativen Thread, aber da es den Global Interpreter Lock gibt, bekommen Sie in Ihrem Ruby-Code wirklich nichts davon.
Es gibt bereits einige Arbeiten, um dies in anderen Implementierungen zu ändern:
JRuby hat bereits die GIL entfernt (ich bin mir nicht sicher, ob es anfangs eine GIL gab), aber die Implementierung ist nicht zu 100% kompatibel mit MRI, hauptsächlich wegen der nativen Edelsteine, wenn Sie sie verwenden (JRuby nicht C-Erweiterungen zulassen)
Rubinius 2.0 wird die GIL loswerden und die Arbeit daran sollte nun fast abgeschlossen sein: Eine Vorabversion wird bereits getestet und funktioniert schon ziemlich gut.
Edit: Ruby 1.9 aber hinzugefügt Faser, die eine nette Alternative in bestimmten Fällen sein kann, sie sind wie Thread, aber Sie sind derjenige, der sie plant.
Edit2: rubinius news auf Entwicklerversion 2.0: Ссылка
Unter 1.9 kann ein Thread I / O ausführen, während ein anderer Thread lautet CPU-Arbeit erledigen .
Ich habe eine verbreitete Fehleinschätzung gehört, dass Ruby blockiert von Natur aus "Blöcke" Disk IO oder Datenbankabfragen machen. Im Realität wechselt Ruby zu einem anderen thread wann immer es blockieren muss IO. Mit anderen Worten, wenn ein Thread benötigt zu warten, aber keine CPU verwendet, Die integrierten Methoden von Ruby erlauben ein anderes wartender Thread, um die CPU während zu verwenden Der ursprüngliche Thread wartet.
Was mir nicht viel hilft, da ich nicht an I / O gebunden bin, aber es könnte eine gute Nachricht für dich sein.
Tags und Links ruby multithreading