2016-04-07 20 views
0

異なる要求のタイムアウトを処理する単純なタイムアウトクラスを実装しようとしています。これは、正常に動作するようです同じコードの2つのバージョンが同じ結果を返さない

class MyTimer 
    def handleTimeout mHash, k 
    while mHash[k] > 0 do 
     mHash[k] -=1 
     sleep 1 
     puts "#{k} : #{mHash[k]}" 
    end 
    end 
end 

MAX = 3 

timeout = Hash.new 
timeout[1] = 41 
timeout[2] = 5 
timeout[3] = 14 

t1 = MyTimer.new 
t2 = MyTimer.new 
t3 = MyTimer.new 

first = Thread.new do 
    t1.handleTimeout(timeout,1) 
end 

second = Thread.new do 
    t2.handleTimeout(timeout,2) 
end 

third = Thread.new do 
    t3.handleTimeout(timeout,3) 
end 

first.join 
second.join 
third.join 

:ここ

は、最初のバージョンです。すべてのタイムアウトは、互いに独立して動作します。

class MyTimer 
    def handleTimeout mHash, k 
    while mHash[k] > 0 do 
     mHash[k] -=1 
     sleep 1 
     puts "#{k} : #{mHash[k]}" 
    end 
    end 
end 

MAX = 3 

timeout = Hash.new 
timers = Array.new(MAX+1) 
threads = Array.new(MAX+1) 


for i in 0..MAX do 
    timeout[i] = rand(40) 
    # To see timeout value 
    puts "#{i} : #{timeout[i]}" 
end 

sleep 1 

for i in 0..MAX do 
    timers[i] = MyTimer.new 
    threads[i] = Thread.new do 
    timers[i].handleTimeout(timeout, i) 
    end 
end 


for i in 0..MAX do 
    threads[i].join 
end 

Screenshot attached

なぜこの出来事である: Screenshot attached

コードの第2のバージョンは、しかしながら、異なる結果を生成しますか?

アレイを使用してこの機能を実装するにはどうすればよいですか?

同じ機能を実装するより良い方法はありますか?

答えて

0

Thread.newを使用してスレッドを作成しているループでは、imainスレッド(スレッドの作成先)と作成されたスレッドで共有されます。したがって、iの値はhandleTimeoutであり、一貫性がなく、異なる結果が得られます。

あなたはあなたの方法でデバッグ文を追加することで、これを検証することができます。

#... 
def handleTimeout mHash, k 
    puts "Handle timeout called for #{mHash} and #{k}" 
    #... 
end 
#... 

問題を修正するには、以下のようなコードを使用する必要があります。ここでパラメータはThread.newに渡され、その後ブロック変数を使用してアクセスされます。この問題に関する

for i in 0..MAX do 
    timers[i] = MyTimer.new 
    threads[i] = Thread.new(timeout, i) do |a, b| 
    timers[i].handleTimeout(a, b) 
    end 
end 

よりWhen do you need to pass arguments to Thread.new?このarticleに記載されています。

+0

私はこのようなものを使用して、サーバーへの要求のタイムアウトを処理します。それを行う良い方法はありますか? –

+0

@ B.Nabiどのような要求がありますか? HTTP? –

+0

はいHTTPリクエスト。 –