0

複数のスレッドを実行すると何か問題がありますか?

action1 を使用してページを読み込むと、機能します。

ホームコントローラー

def action1
    threads = []
    threads << Thread.new {@lub = client.tag_recent_media('tag1')}
    Thread.new{@tags = client.tag_recent_media('encorebeach')}
    Thread.new{@location = client.location_recent_media('16565')}

    threads.each(&:join)  
end

ホームビュー

<% (@lub+@tags+@location).each do |media| %>
<%= media %>
<% end %>

別のビューを持つ別のコントローラーを次に示します。

別のコントローラー

def action1
    threads2 = []
    threads2 << Thread.new {@lub2 = client.tag_recent_media('tag1')}
    Thread.new{@tags2 = client.tag_recent_media('encorebeach')}
    Thread.new{@location2 = client.location_recent_media('16565')}

    threads2.each(&:join)  
end

別のビュー

<% (@lub2+@tags2+@location2).each do |media| %>
<%= media %>
<% end %>

2番目の出力では、エラーが発生します

undefined method `+' for nil:NilClass

スレッドに問題があると思います。なぜこれが起こっているのか、誰かが私を助けることができますか? ホームページですでにスレッドを実行した後、別のページに移動したいときに、再度スレッドを実行して動作しないためでしょうか?

ありがとう!

4

1 に答える 1

2

threads最初のスレッドのみが含まれます。ビューでインスタンス変数を使用する前に、最初のメソッドのスレッドが終了しているのはまったくの幸運です。

threads = []
threads << Thread.new {@lub = client.tag_recent_media('tag1')}
threads << Thread.new{@tags = client.tag_recent_media('encorebeach')}
threads << Thread.new{@location = client.location_recent_media('16565')}

またはさらに簡単:

threads = [
  Thread.new{@lub = client.tag_recent_media('tag1')},
  Thread.new{@tags = client.tag_recent_media('encorebeach')},
  Thread.new{@location = client.location_recent_media('16565')}
]

あなたが望むものを達成します。

コントローラー スレッドで実行する場合に比べて、パフォーマンスがあまり向上しない可能性が非常に高くなります。データベース サーバーをスラッシングして、代わりに速度を低下させる可能性さえあります。スレッドによってパフォーマンスが得られるかどうかを測定し、スレッドの使用には多くの落とし穴があることに注意してください。

于 2013-04-19T05:59:20.823 に答える