Ruby:如何在运行对象的线程之间共享全局变量

时间:2019-04-29 01:22:42

标签: ruby multithreading global-variables

我正在运行创建多个线程的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对象之外,那么它将起作用。

1 个答案:

答案 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)