-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)
スレッドが別々のサブシェルやRubyスクリプトの別の呼び出しと同じではないも、彼らは並列です。彼らは同じインタプリタ、環境、そして 'ENV'を共有しています。 "この問題を解決することなく、私はスレッドをまったく使用できません。"まあ、それは劇的です。スレッドはあらゆる問題の解決策ではありませんが、非常に便利ですが、目標を理解することができなければ、あまり役に立ちません。おそらくスレッドを使用するというあなたの決断は "[XY問題](https://meta.stackexchange.com/q/66377/153968)"となり、より良い方法があるかもしれません。 –
私がスレッドを選んだのは、サーバーに100個のDBがあるからです。 SQLを連続して実行するには時間がかかります。 ORACLE_SIDのような別のENVと並列にコードを実行するにはどうすればよいですか?私は、今直面している問題を実際に突き止める簡単なコードを選んだ。コメントは歓迎です – Jon
@Jon:おそらくデータベースソフトウェア/ APIを使用してその方法で使用することを意図しています。私はそれが却下的だと思っていますが、あなたがレガシーなメンテナンスをしていない限り、それが設計されていない状況にソフトウェアを変えようとすることは価値がありません。 – Linuxios