Ruby线程和变量

mes*_*600 6 ruby multithreading thread-safety

为什么结果不是1到10,而只是10s?

require 'thread'

def run(i)
  puts i
end

while true
  for i in 0..10
    Thread.new{ run(i)}
  end
  sleep(100)
end
Run Code Online (Sandbox Code Playgroud)

结果:

10
10
10
10
10
10
10
10
10
10
10
Run Code Online (Sandbox Code Playgroud)

为什么循环?我正在循环运行,因为后来我想一直遍历数据库表并回显从数据库中检索到的任何记录.

Mat*_*att 8

传递给的块Thread.new实际上可能在将来的某个时刻开始,到那时,值i可能已经改变.在你的情况下,它们都10增加到所有线程实际运行之前.

要解决此问题,Thread.new除了块之外,使用接受参数的形式:

require 'thread'

def run(i)
  puts i
end

while true
  for i in 0..10
    Thread.new(i) { |j| run(j) }
  end
  sleep(100)
end
Run Code Online (Sandbox Code Playgroud)

这会将块变量设置为调用时j的值.inew