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

标签 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

对我来说,当我在第二个 while< 的 work() pp $pool.size 中填充 $pool 时,这是意外的 始终循环0

我哪里错了?

最佳答案

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

关于ruby - 意外的 ruby​​ 全局数组变量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7498387/

相关文章:

Ruby 阶乘函数

ruby - bundle 成功但未加载所有 gem

java - fork 一个进程

ruby - 安装cocoapod时获取 "don' t有写权限

ruby - 使用 Sinatra : Signed Cookie (with Rack) 的 Facebook Canvas 身份验证

ruby - Ruby 中的动态正则表达式

c - fork 一个 child 并调用 gcc

无法关闭管道 : bad file descriptor

c - 服务器中的父进程卡在接受调用中。我如何从 child 那里干净地终止 parent

C语言中的子父关系和继承