Verwendung von Unix Process Control Methods in Ruby
-
05-07-2019 - |
Frage
Ryan Tomayko berühren ziemlich Feuersturm mit diesem Beitrag über die Verwendung von Unix-Prozesssteuerung aus Befehle.
Wir sollten mehr davon tun. Viel mehr davon. Ich spreche über fork (2), execve (2), Rohr (2), socket (2), wählen Sie (2), töten (2), sigaction (2), und so weiter und so fort. Das sind unsere Freunde. Sie wollen so schlecht nur uns zu helfen.
Ich habe ein Stück Code (ein delayed_job
Klon für DataMapper dass ich denke, würde mit diesem Recht passen, aber ich bin mir nicht klar, wie man die Vorteile der genannten Befehle nehmen. Alle Ideen, wie den Code zu verbessern?
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
Lösung
Ahh ja ... die Gefahren von „Wir sollten mehr davon tun“, ohne zu erklären, was jeder von denen tun und unter welchen Umständen Sie sie verwenden würde. Für so etwas wie delayed_job
können Sie sogar fork
verwenden, ohne zu wissen, dass Sie fork
verwenden. Das heißt, es wirklich keine Rolle spielt. Ryan sprach mit fork
für preforking Servern. delayed_job
verwenden würde fork
für einen Prozess in einen Dämon verwandeln. Gleicher Systemaufruf, verschiedene Zwecke. Laufen delayed_job
im Vordergrund (ohne fork
) vs im Hintergrund (mit fork
) in einem vernachlässigbaren Unterschied in der Leistung führen wird.
Wenn Sie jedoch einen Server schreiben, die gleichzeitige Verbindungen akzeptiert, jetzt Ryans Rat ist, direkt auf das Geld.
-
fork
: erstellt eine Kopie des ursprünglichen Prozesses -
execve
: Stoppen die aktuelle Datei ausführt und beginnt eine neue Datei im gleichen Prozess (sehr nützlich in Rake Aufgaben) Ausführen
-
pipe
: erzeugt ein Rohr (zwei Dateideskriptoren, ein für Lese-, ein für Schreib) -
socketpair
: wie ein Rohr, aber für Steckdosen -
select
: lassen Sie sich für einen oder mehr von mehreren Filedeskriptoren warten bereit zu sein, mit einem Timeout -
kill
: verwendet, um ein Signal an einen Prozess senden -
sigaction
: Ermöglicht das ändern, was passiert, wenn ein Prozess ein Signal empfängt
Andere Tipps
5 Monate später, können Sie meine Lösung unter http://github.com/antarestrader/Updater. Schauen Sie sich lib / Updater / fork_worker.rb