意外的ruby全局数组变量行为

时间:2011-09-21 10:41:32

标签: ruby fork

我有这段代码:

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}}

我哪里错了?

1 个答案:

答案 0 :(得分:3)

使用fork创建新进程时,新进程将获取(空)$池的副本。执行循环的父进程中的$ pool永远不会填充任何内容(在子进程中执行对工作函数的调用),因此它的大小始终为0.