Ich möchte einen Codeblock in meinem Hauptprozess in den untergeordneten Prozess verschieben, damit er gleichzeitig ausgeführt wird. Ich möchte auch die PID des erzeugten Child-Prozesses haben, damit ich sie überwachen und bei Bedarf töten kann.Wie spawnt du einen Child-Prozess in Ruby?
Antwort
Sie können die Kernel-Methode fork
verwenden. Hier ein Beispiel:
#!/usr/bin/env ruby
puts "This is the master process."
child_pid = fork do
puts "This is the child process"
exit
end
puts "The PID of the child process is #{child_pid}"
fork
Die Methode, um die PID des Prozesses kehrt er sich gabelt und führt jeden Code in dem Block übergeben. Wie normale Ruby-Blöcke behält es die Bindungen des übergeordneten Prozesses bei.
Es ist eine gute Idee, Ihren gegabelten Prozess 10 zu machen.
Zusätzlich zu Chris 'großer Antwort, denken Sie daran, Process.wait
von Ihrem Master zu rufen, um Ihren Kindprozess zu ernten, sonst lassen Sie Zombies zurück.
Beispiel wie in den Kommentaren angefordert:
pid = Process.fork do
puts "child, pid #{Process.pid} sleeping..."
sleep 5
puts "child exiting"
end
puts "parent, pid #{Process.pid}, waiting on child pid #{pid}"
Process.wait
puts "parent exiting"
Süße, das war ein toller Tipp. –
Wo und wie würden Sie Process.wait in die obige Antwort einfügen? – iamtoc
Beachten Sie, dass "Process.wait" ohne ein Argument auf _any_ child wartet. In einem allgemeineren Fall würde dieses Code-Snippet den übergeordneten Code daher auch dann beenden, wenn dieser bestimmte untergeordnete Prozess nicht beendet wird. Eine genauere Version würde stattdessen 'Process.wait (pid)' sagen. – sameers
Wenn Sie glücklich sind Threads zu verwenden, anstatt Prozesse, dann so etwas wie diese kann ein bisschen mehr skalierbar sein, mehr-als-eine Gabel:
def doit(x)
sleep(rand(10))
puts "Done... #{x}"
end
thingstodo = ["a","b","c","d","e","f","g"]
tasklist = []
# Set the threads going
thingstodo.each { |thing|
task = Thread.new(thing) { |this| doit(this) }
tasklist << task
}
# Wait for the threads to finish
tasklist.each { |task|
task.join
}
Bitte beachten Sie die exzellenten Kommentare und Referenzen von John Topley zum Ruby-Ausführungsmodell und seinen Einschränkungen.
bearbeitet gerade einen eklatanten Fehler (keine Zuordnung zu Aufgabe) zu korrigieren, und zu folgen @ (Jason King) 's Beratung.
Vermutlich sind dies grüne Threads und keine richtigen OS-Threads? –
Lies das in Bezug auf Ruby 1.9: http://www.igvita.com/2008/11/13/concurrency-is-a-myth-in-ruby/ –
Sollte sein: 'Thread.new (thing) {| it | doit (it)} ' Da' Ding' bei jeder Iteration zurückgesetzt wird, gibt es keine Garantie, dass der richtige Thread das richtige 'Ding' bekommt – smathy
In 1.9 können Sie den Process.spawn-Befehl verwenden. Siehe auch http://en.wikibooks.org/wiki/Ruby_Programming/Running_Multiple_Processes
Eine gute Alternative zu fork/exec/Laich ist die Posix-Spawn-Juwel für Ruby 1.9: https://github.com/rtomayko/posix-spawn
Sie haben die meisten der harten Arbeit, die es einfacher, effizienter zu gestalten und flexibel im Vergleich zu die untergeordneten Methoden.
- 1. Ruby-Module und du selbst
- 2. in vb.net, wie man einen Thread spawnt, der einen Byref-Parameter hat?
- 3. Wie kopierst du einen CALayer?
- 4. Der Bash-Befehl:() {: |: & };: spawnt Prozesse zum Kerneltod. Kannst du die Syntax erklären?
- 5. Wie strukturierst du einen Entwicklungssprint?
- 6. Wie zeichnest du einen Sektor in Matplotlib?
- 7. Wie codierst du einen Mustervergleichscode in scala?
- 8. Wie parst du einen HTML in vb.net
- 9. Pause und Rückkehr in Ruby, wie benutzt du sie?
- 10. Wie konvertierst du einen String in einen Float oder Int?
- 11. Wie transformierst du einen UPN-Namen in einen Login-Namen?
- 12. Wie interpretierst du einen entschleierten Android-Absturzbericht?
- 13. Wie suchst du einen Amazon S3-Eimer?
- 14. Wie installierst du filemagic (libmagic) in Heroku?
- 15. Wie visualisierst du einen Gemeindebaum von sklearn.cluster.ward_tree?
- 16. Wie zeichnest du einen normalen Kreis?
- 17. Wie übermittelst du Daten in einen IValueConverter in XAML?
- 18. Wie konvertierst du eine Binärzahl in einen BigInteger in Java?
- 19. Kannst du eine Bestellung in Ruby nach einem Fund machen?
- 20. Wie tust du TDD in Xcode?
- 21. Was bedeutet die Syntax? meinst du in diesem Ruby-Beispiel?
- 22. Wie machst du ein Radialdiagramm?
- 23. Wie machst du nur einen Text in einem Eingabetextfeld fett?
- 24. Wie speicherst du nicht kopierbare std :: -Funktion in einen Container?
- 25. Wie schreibst du einen OAuth2-Server in Perl?
- 26. Wie gibst du einem Namespace einen Alias in C#
- 27. Wie drehst du einen String "04L" in "04" und "L"?
- 28. Wie simulierst du einen Förderer in Bullet Physics Engine?
- 29. Wie machst du einen os.path.join mit einem Array in Python?
- 30. Wie aktivierst du einen Bit-Datentyp in SQL Server?
Eine Sache mit Ruby zu erinnern ist, dass nicht alle Dinge genau so in Windows vs. * nix funktionieren. Manchmal sind sie unter Windows nicht implementiert, also verwenden Sie auf eigene Gefahr. – Daemin
Dieser würde in Windows überhaupt nicht funktionieren – vava
@Vadim Ich denke, das ist eine Funktion, kein Fehler. –