-1
我正在嘗試使用線程(如x2.rb)並行運行ruby代碼。 我在這裏貼了一個簡單的示例代碼來解決我的問題。 在這裏,我不明白爲什麼ENV沒有設置不同的每個線程。我一直堅持這一點。誰能幫我嗎? 沒有解決這個問題,我根本無法使用線程。紅寶石,如何在每個線程中設置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)」,並且可能有更好的方法。 –
我選擇Threads的原因是我有一個服務器中有100個DB。串行執行SQL需要很長時間。如何與不同的數據庫並行運行一個不同的像ORACLE_SID這樣的ENV?我選擇了上面的簡單代碼來真正指出我現在面臨的問題。歡迎任何評論 – Jon
@Jon:可能通過使用旨在以這種方式使用的數據庫軟件/ API。我知道這聽起來很不屑一顧,但有一點超越了它,試圖將軟件扭曲到沒有設計的環境中是不值得的,除非您正在進行傳統維護。 – Linuxios