将唯一变量传递给Ruby线程

时间:2012-12-06 16:52:59

标签: ruby multithreading variables

我在for循环中创建线程,我想使用for循环的i作为每个特定线程的名称。当我运行此操作时,我得到12,而不是2122。是否有更好/更安全的方法将变量传递给线程?

ts = []
for i in 1..2 do
  ts.push( Thread.new(i) do
    x = i
    puts x
  end)
end
ts.each do |t|
  t.join()
end

2 个答案:

答案 0 :(得分:3)

您的问题是,您所指的i不是传递给线程的块变量,而是在线程外定义的i。您需要向其添加|i|,您将获得1221

ts = []
for i in 1..2 do
  ts.push( Thread.new(i) do |i|
    x = i
    puts x
  end)
end
ts.each do |t|
  t.join()
end

顺便说一下,写一种更为红润的方式是:

ts = (1..2).map do |i|
  Thread.new(i) do |i|
    puts i
  end
end.each(&:join)

如果您要为每个线程寻找唯一的名称,我建议使用该线程的对象ID。

ts = (1..2).map do
  Thread.new do
    puts Thread.current.object_id
  end
end.each(&:join)

答案 1 :(得分:2)

您可以通过块传递变量

ts = []

for i in 1..2 do
  ts.push( Thread.new(i) do |i|
    x = i
    puts x
  end)
end

ts.each do |t|
  t.join()
end

# => 1
# => 2