我正在运行创建多个线程的ruby脚本。
我想让线程可以访问一个公共变量,该变量可以让主线程知道何时加入线程。
我正在尝试使用$ global变量来执行此操作,但是线程似乎无法访问$ global。
class IO_
def change(number)
sleep(60 * number)
$trade_executed = true
end
end
io = IO_.new
numbers = 1, 2
$threads = {}
$trade_executed = false
def start_threads(numbers)
numbers.each do |number|
$threads[number] = Thread.new {io.change(number)}
end
end
start_threads(numbers)
while true
p $trade_executed
p $threads
sleep(10)
end
上面执行的$ trade_execute始终为'false'。
但是,如果我将方法更改移到io对象之外,那么它将起作用。
答案 0 :(得分:1)
问题出在功能start_threads
中。您在该函数中调用了io.change(number)
,但是该函数中未定义局部变量io
。结果是两个线程都由于NameError
而死亡。
您可以这样更改start_threads
函数:
def start_threads(numbers, io)
numbers.each do |number|
$threads[number] = Thread.new {io.change(number)}
end
end
并这样称呼它:
start_threads(numbers, io)