2017-05-16 20 views
-1

私はx2.rbのようなスレッドを使って並列にルビコードを実行しようとしています。 私は問題のためにできるだけシンプルなサンプルコードをここに貼り付けました。 ここでは、ENVがスレッドごとに異なって設定されていない理由を理解できません。私はこれにこだわりました。誰か助けてくれますか? この問題を解決することなく、私はスレッドをまったく使用できません。ruby​​、各スレッドでENV変数を設定する方法は?

# ./x1.rb 
test1 a .. a .. {"TEST"=>"a"} 
test1 b .. b .. {"TEST"=>"b"} 
test1 c .. c .. {"TEST"=>"c"} 

# ./x2.rb 

test1 a .. a .. {"TEST"=>"c"}  # this needs to be {"TEST"=>"a"} 
test1 b .. b .. {"TEST"=>"c"}  # this needs to be {"TEST"=>"b"} 
test1 c .. c .. {"TEST"=>"c"}  # this needs to be {"TEST"=>"c"} 

x1.rb: 

#!/usr/bin/ruby 

test_hash = {'a': 1, 'b': 2, 'c': 3} 

def test_env(k, v) 
    ENV.clear 
    ENV['TEST'] = k.to_s 
    print "test1 #{k} .. #{ENV['TEST']} .. " 
    p ENV 
    # run_cmd(ENV, "cmd to run") 
end 

test_hash.each do |k, v| 
    test_env(k, v) 
end 

x2.rb: 

#!/usr/bin/ruby 

test_hash = {'a': 1, 'b': 2, 'c': 3} 
threads = [] 

def test_env(k, v) 
    ENV.clear 
    ENV['TEST'] = k.to_s 
    print "\ntest1 #{k} .. #{ENV['TEST']} .. " 
    p ENV 
    # run_cmd(ENV, "cmd to run") 
end 

test_hash.each do |k, v| 
    threads << Thread.new(k, v) do |k, v| 
    test_env(k, v) 
    end 
end 

threads.each(&:join) 
+2

スレッドが別々のサブシェルやRubyスクリプトの別の呼び出しと同じではないも、彼らは並列です。彼らは同じインタプリタ、環境、そして 'ENV'を共有しています。 "この問題を解決することなく、私はスレッドをまったく使用できません。"まあ、それは劇的です。スレッドはあらゆる問題の解決策ではありませんが、非常に便利ですが、目標を理解することができなければ、あまり役に立ちません。おそらくスレッドを使用するというあなたの決断は "[XY問題](https://meta.stackexchange.com/q/66377/153968)"となり、より良い方法があるかもしれません。 –

+0

私がスレッドを選んだのは、サーバーに100個のDBがあるからです。 SQLを連続して実行するには時間がかかります。 ORACLE_SIDのような別のENVと並列にコードを実行するにはどうすればよいですか?私は、今直面している問題を実際に突き止める簡単なコードを選んだ。コメントは歓迎です – Jon

+1

@Jon:おそらくデータベースソフトウェア/ APIを使用してその方法で使用することを意図しています。私はそれが却下的だと思っていますが、あなたがレガシーなメンテナンスをしていない限り、それが設計されていない状況にソフトウェアを変えようとすることは価値がありません。 – Linuxios

答えて

1

あなたはこのようなあなたのスレッドに参加した場合、それは動作します:

test_hash.each do |k, v| 
    Thread.new(k, v) do |k, v| 
    test_env(k, v) 
    end.join 
end 
+1

問題を解決しました。ありがとうございました – Jon

関連する問題