неожиданное поведение переменной глобального массива ruby - PullRequest
2 голосов
/ 21 сентября 2011

У меня есть этот код:

require 'pp'

$pool = []

def work arg
    $pool.push($$)
    sleep (1 + rand(5))
    $pool.delete($$)
    exit
end

ary = []
100.times { |x| ary.push(x) }

while ary.any? do 
    while $pool.size < 10 && ary.any?
        arg = ary.pop
        Process.detach( fork { work(arg) } )
        pp $pool.size
        sleep 0.01
    end
end

для меня это неожиданно, когда я заполняю $pool в work() pp $pool.size в секунду while цикл всегда 0

где я не прав?

1 Ответ

3 голосов
/ 21 сентября 2011

Когда вы создаете новый процесс с помощью fork, новый процесс получает копию (пустого) $ pool. $ Pool в родительском процессе, который выполняет цикл, никогда не заполняется чем-либо (вызов функции work выполняется в дочернем процессе), поэтому его размер всегда равен 0.

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