Ruby: Как мне совместно использовать глобальную переменную среди потоков, в которых выполняется object.method - PullRequest
0 голосов
/ 29 апреля 2019

Я запускаю скрипт ruby, который создает несколько потоков.

Я хочу, чтобы потоки имели доступ к общей переменной, которая позволяет основному потоку знать, когда присоединяться к потокам.

Я пытаюсь сделать это с помощью глобальной переменной $, нокажется, что потоки не могут получить доступ к $ 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_executed всегда будет иметь значение «false».

Но если я переместу изменение метода за пределы объекта io, оно сработает.

1 Ответ

1 голос
/ 29 апреля 2019

Проблема в функции 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...