Ruby Language Fusion de deux files d'attente


Exemple

  • Pour éviter le blocage à l'infini, la lecture des files d'attente ne devrait pas avoir lieu lorsque la fusion de threads se produit.
  • Pour éviter la synchronisation ou l'attente infinie d'une des files d'attente alors que d'autres ont des données, la lecture des files d'attente ne devrait pas avoir lieu sur le même thread.

Commençons par définir et alimenter deux files d'attente:

q1 = Queue.new
q2 = Queue.new
(1..100).each { |e| q1 << e }
(101..200).each { |e| q2 << e }

Nous devrions créer une autre file d'attente et y insérer des données provenant d'autres threads:

merged = Queue.new

[q1, q2].map do |q|
  Thread.new do
    loop do
      merged << q.pop
    end
  end
end

Si vous savez que vous pouvez consommer complètement les deux files d'attente (la vitesse de consommation est supérieure à la production, vous ne manquerez pas de RAM), l'approche est plus simple:

merged = Queue.new
merged << q1.pop until q1.empty?
merged << q2.pop until q2.empty?