参考までに、アクセスを同期しない限り、同じアレイへの読み取り/書き込みで問題が発生する可能性があります。Ruby の組み込みQueueクラスを見てください。スレッドの一部です。
衝突しない複数のプロデューサー/コンシューマーを持つことができます。ドキュメントの内容は次のとおりです。
このクラスは、スレッド間の通信を同期する方法を提供します。
例:
require 'thread'
queue = Queue.new
producer = Thread.new do
5.times do |i|
sleep rand(i) # simulate expense
queue << i
puts "#{i} produced"
end
end
consumer = Thread.new do
5.times do |i|
value = queue.pop
sleep rand(i/2) # simulate expense
puts "consumed #{value}"
end
end
consumer.join
配列をループするために使用する限り、each
構文的には次を使用する必要があると思います。
loop do
break if @@payloads.empty?
end
each
反復する要素の有限セットを意味します。説明には次のように書かれています。
自分自身の要素ごとに指定されたブロックを 1 回呼び出します....
他の言語では、ループの開始時に要素の数が設定されているため、繰り返し処理しているコンテナーを変更することはできません。コンテナーを変更しようとすると、エラーが発生します。それができることに頼るとeach
、他の言語でその動作が見られるという期待につながる可能性があります。私の考えでは、あなたは副作用またはサイドドアに頼っていますが、これは良い習慣ではありません。
loop
これは単純なループであるため、条件付きで独自のロジックの使用から抜け出す必要があることを意味するものではありません。の例を次に示しloop
ます。
loop do
print "Input: "
line = gets
break if !line or line =~ /^qQ/
# ...
end
要素数の仮定はなく、完全に無制限です。empty?
そして、キューには必要なメソッドがあるため、簡単に抜け出すことができます。
それが私の 0.02 ドルで、私ならどうするかです。
ページの右側にある「関連」スレッドを見て、追加のアイデアを入手してください。