我正在尝试使用像x2.rb这样的线程并行运行ruby代码。 我已经在这里粘贴了一个尽可能简单的示例代码来解决我的问题。 在这里,我无法弄清楚为什么每个线程没有设置不同的ENV。我一直坚持这个。谁能帮我吗? 如果不解决这个问题,我就不能使用Threads了。
# ./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)
答案 0 :(得分:1)
如果你加入这样的线程,它将起作用:
test_hash.each do |k, v|
Thread.new(k, v) do |k, v|
test_env(k, v)
end.join
end