2017-05-16 45 views
-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) 
+2

線程是不一樣的獨立的子炮彈或Ruby的單獨調用和腳本也不是平行;他們共享相同的解釋器,環境和'ENV'。 「如果不解決這個問題,我根本無法使用線程。」那很戲劇化。線程不是解決所有問題的方法,但它們非常有用,但是如果不瞭解您的目標,我們無法提供幫助。也許你決定使用線程會導致「[XY問題](https://meta.stackexchange.com/q/66377/153968)」,並且可能有更好的方法。 –

+0

我選擇Threads的原因是我有一個服務器中有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