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)
为什么循环?我正在循环运行,因为后来我想一直遍历数据库表并回显从数据库中检索到的任何记录.
传递给的块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