1

sinatra をセットアップして、github リポジトリからのコミットをリッスンしています。私が現在セットアップしているシステムは、投稿をリッスンし、ペイロードをペイロード配列にプッシュします。それから私は電話します

@@payloads.each do .... whatever

複数の投稿が github から入ってきた場合、つまり、@@payloads.each実行中に人々がより多くのコミットをプッシュした場合、どうなりますか? ペイロードが 1 つある場合、別のペイロードがプッシュされpayloads.eachます。コールはもう一度循環しますか? それとも、.each呼び出しが行われると、呼び出しが通過するペイロードの数が固定されるように設定されていますか?

4

2 に答える 2

1

参考までに、アクセスを同期しない限り、同じアレイへの読み取り/書き込みで問題が発生する可能性があります。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 ドルで、私ならどうするかです。

ページの右側にある「関連」スレッドを見て、追加のアイデアを入手してください。

于 2013-07-15T15:44:24.757 に答える
1

が標準の ruby​​ 配列である限り@@payloads、プッシュされたペイロードは#each反復に含まれるはずです。

あるスレッドが配列を反復処理し、別のスレッドが同じ配列に追加する場合、反復スレッドには追加された項目が含まれます。

この動作を示す簡単なプログラムを含むこの要点を見てください。1 つのスレッドが繰り返され、別のスレッドが配列に追加されます。Ruby のスレッドスケジューリングの性質により、結果は毎回異なる可能性があります。

于 2013-07-15T15:45:58.197 に答える