ruby,如何在每个线程中设置ENV变量?

时间:2017-05-16 22:10:31

标签: ruby multithreading

我正在尝试使用像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)

1 个答案:

答案 0 :(得分:1)

如果你加入这样的线程,它将起作用:

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