Ich habe den folgenden Code in einer Funktion:Gibt es eine bessere Möglichkeit, prozessübergreifende Warteschlangen ohne ein externes Programm als das zu tun?
num_procs.times do
pid = fork
unless pid
DRb.start_service
ts = Rinda::TupleSpaceProxy.new(DRbObject.new_with_uri('druby://localhost:53421'))
loop do
item = ts.take([:enum, nil, nil])
# our termination tuple
break if item == [:enum, -1, nil]
result =
begin
block.call(item[2])
rescue Object => e
e
end
# return result
ts.write([:result, item[1], result])
end
DRb.stop_service
exit!
end
pids << pid
end
pts = Rinda::TupleSpace.new
# write termination tuples
items.size.times do
pts.write([:enum, -1, nil])
end
items.each_with_index { |item, index|
pts.write([:enum, index, item])
}
DRb.start_service('druby://localhost:53421', pts)
# Grab results
items.size.times do
result_tuples << pts.take([:result, nil, nil])
end
pp "Waiting for pids: #{pids.inspect}" if FORKIFY_DEBUG
pids.each { |p| Process.waitpid(p) }
DRb.stop_service
# gather results and sort them
result_tuples.map { |t|
results[t[1]] = t[2]
}
return results
Dieser Code Gabeln eine verschiedene Anzahl von Zeiten, die Kinder dann versuchen Tupel aus dem Elternteil zu erhalten mit einem Rinda :: TupleSpaceProxy über DRb. Der Vater schiebt Elemente für jeden Prozess, um einen Block aufzurufen. Die Kinder geben dann ihre Ergebnisse mit verschiedenen Tupeln an die Eltern zurück, die sie zusammenfassen.
Dieser Code befindet sich in einer Bibliothek, daher möchte ich nicht, dass der Benutzer etwas wie beanstalkd oder Ähnliches starten muss, nur um Jobs für den Prozesspool anzuordnen. Meine Frage ist diese:
Gibt es einen besseren Weg, ich Cross-Prozess-Queue-Kommunikation tun kann?
Es tut mir leid, der obige Code ist ein Ausschnitt aus der Bibliothek, es läuft nicht ohne den anderen Code. Der vollständige Code für die Bibliothek ist hier: http://github.com/dakrone/forkify (Sie können die Dokumente und Beispiele dort auch sehen) Ich wollte wirklich vermeiden, eine externe Abhängigkeit für diese Bibliothek zu haben, so hoffentlich kann ich Finde einen Weg ohne Bohnenstange oder DJ. – thnetos