2009-07-13 7 views
0

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?

Antwort

0

(Ich habe versucht, den obigen Code, aber auch nach ein paar Veränderungen und erfordert, ich war nicht in der Lage, um es gehen, so nehmen diese Beratung mit Salzkorn. Laufen)

Statt DRb es wäre wahrscheinlich besser, sich auf eine Abhängigkeit von beanstalk/delayed_job/[andere warteschlange] festzulegen. Wenn dies nur ein Hintergrundjob ist, würde ich DJ empfehlen, da es bekannt und einfach zu starten ist (siehe this example für eine schnelle Grundierung). Wenn Sie mehr Code posten könnten, wäre es einfacher zu helfen.

+0

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

Verwandte Themen