Ryan Tomayko löste einen ziemlichen Feuersturm mit this post über die Verwendung von Unix-Prozesssteuerbefehlen aus.Verwenden von Unix-Prozesssteuerungsmethoden in Ruby
Wir sollten mehr davon tun. Viel mehr davon. Ich spreche von fork (2), execve (2), pipe (2), socketpair (2), wählen Sie (2), kill (2), sigaction (2) und so weiter und so weiter. Das sind unsere Freunde. Sie wollen so sehr, nur um uns zu helfen.
Ich habe ein Stück Code (einen delayed_job
Klon für DataMapper dass ich denke, würde direkt mit diesem passen, aber ich bin mir nicht klar, wie man die Vorteile der genannten Befehle nehmen. Alle Ideen, wie zur Verbesserung der dieser Code?
def start
say "*** Starting job worker #{@name}"
t = Thread.new do
loop do
delay = Update.work_off(self)
break if $exit
sleep delay
break if $exit
end
clear_locks
end
trap('TERM') { terminate_with t }
trap('INT') { terminate_with t }
trap('USR1') do
say "Wakeup Signal Caught"
t.run
end
end
Also anstatt einen (grünen) Thread zu erstellen, könnte ich stattdessen fork (2) verwenden und eine PID zurückgeben. So viel habe ich getan. Wie arbeite ich mit dem Block für Trap ('USR1'), der den Thread aufweckt, wenn ich einen neuen Job in die Warteschlange stoße? Wie würde ich mehr als einen Prozess erstellen und sie dazu bringen, die Warteschlange optimal abzuwickeln? Die Magie scheint in der Leitung zu sein und zu wählen, aber ich verstehe die Feinheiten nicht. Ich kann den Daemon-Edelstein verwenden, um einen Daemon-Prozess zu erstellen, der Gabel unter der Haube verwendet. Ich möchte einige untergeordnete Prozesse starten, um die Warteschlange auszuführen. –
Hängt davon ab, was "Arbeit" in diesem Zusammenhang bedeutet. Wenn "work" I/O ist, könnte es anders sein und yeah, 'select' ist wichtig. Ich bevorzuge es, Arbeitswarteschlangen so zu gestalten, dass Arbeiten in beliebiger Reihenfolge ausgeführt werden können. Wenn Arbeitseinheit 1 also gleichzeitig mit Arbeitseinheit 2 ausgeführt wird, ist das kein Problem. Was die Daemons betrifft, habe ich sie benutzt, aber jetzt benutze ich 'fork' direkt oder benutze meine ChainGang-Bibliothek.Ich fand, dass Dämonen zu viel wichtiges Zeug verbargen, und es war unnötiger Overhead für etwas, das eigentlich gar nicht so schwer ist. Beachten Sie, dass ChainGang sehr Alpha-Qualität ist. –
Im Grunde macht es in den meisten Kontexten keinen Sinn, sich Sorgen zu machen, ob man die Warteschlange optimal abwickeln soll. Entweder arbeiten Sie mit I/O, in diesem Fall verwenden Sie wahrscheinlich keine "delayed_job" -Warteschlange, oder Sie führen Dinge als diskrete Arbeitseinheiten aus. In diesem Fall machen 'select' und' pipe' keine Sinn. Wie auch immer, der richtige Weg, um mit einer Arbeitswarteschlange fertig zu werden, besteht darin, einfach alles, was oben ist, zu greifen, wann immer Sie frei sind. Und wenn da nichts ist, ist es wahrscheinlich in Ordnung, einfach zu blocken, bis es da ist. –